【问题标题】:How display post "on moderation" for admin at site page "Post list" at Django 2.1?如何在 Django 2.1 的站点页面“帖子列表”上为管理员显示“审核”帖子?
【发布时间】:2019-01-11 13:14:54
【问题描述】:

Previous Ask

我想在站点页面“帖子列表”(模板“post_list.html”)上为管理员(员工)显示一个“适度”存在的新帖子,例如“scrin1”(帖子 1 -已发布;帖子 2 - “关于适度”)。普通用户只能看到已发布帖子的“帖子列表”,请参阅“scrin2”。这样可以确保每个管理员没有进入站点的管理面板,但可以从站点页面“发布更新”(模板“post_form.html”)发布此帖子,例如“scrin3”。 我尝试在views.py 中使用staff_member_required(PostListView 中的form_valid),但没有成功。 如果帖子被编辑,也必须在发布编辑版本之前进行审核。

以下代码显示了管理面板中帖子审核的实现。我只是不知道如何从站点页面(无需登录管理面板,例如,从站点页面“... / post / / update”)对帖子(创建或更新)进行审核,只是通过勾选“审核”中的复选框)

models.py

class Post(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    title = models.CharField(max_length=50)
    body = models.TextField()
    moderation = models.BooleanField(default=False)

    def __str__(self):
        return self.title

    def get_absolute_url(self):
        return reverse('post-detail', kwargs={'pk': self.pk})

forms.py

from .models import Post

class PostForm(forms.ModelForm):
    title = forms.CharField(required=True)
    body = forms.CharField(widget=forms.Textarea)

    class Meta:
        model = Post
        fields = ['title', 'body']

views.py

from .forms import PostForm

class PostListView(generic.ListView):
    model = Post
    paginate_by = 10

    def get_queryset(self):
        queryset = super(PostListView, self).get_queryset()
        return queryset.filter(moderation=True)


class PostCreateView(FormView):
    form_class = PostForm
    template_name = 'blog/post_form.html'
    success_url = reverse_lazy('posts')

    def form_valid(self, form):
        response = super(PostCreateView, self).form_valid(form)
        form.instance.user = self.request.user
        form.save()
        return response


class PostUpdateView(PermissionRequiredMixin, UpdateView):
    model = Post
    fields = ['title', 'body']
    permission_required = 'blog.can_mark_returned'

admin.py

from .models import Post

class PostAdmin(admin.ModelAdmin):
    list_display = ('title', 'user', 'moderation')

admin.site.register(Post, PostAdmin)

urls.py

urlpatterns = [
    url(r'^posts/$', views.PostListView.as_view(), name='posts'),
    url(r'^post/(?P<pk>\d+)$', views.PostDetailView.as_view(), name='post-detail'),
    url(r'^post/create/$', views.PostCreateView.as_view(), name='post_create'),
    url(r'^post/(?P<pk>\d+)/update/$', views.PostUpdateView.as_view(), name='post_update'),
]

post_list.html

{% extends "base_generic.html" %}    
{% block title %}<title>Posts list</title>{% endblock %}
{% block content %}
    <h1>All posts</h1>
    {% if post_list %}
        <ul>
        {% for post in post_list %}
            <li><a href="{{ post.get_absolute_url }}">{{ post.title }}</a> {{ post.user }}</li>
        {% endfor %}
        </ul>
    {% else %}
    <p>There are no posts.</p>
    {% endif %}
{% endblock %}

post_form.html

{% extends "base_generic.html" %}
{% block content %}
    <form action="" method="post" enctype="multipart/form-data">
        {% csrf_token %}
        <table>
            {{ form.as_table }}
        </table>
        <input type="submit" value="Submit" />
    </form>
{% endblock %}

Screen1以“管理员”身份查看页面“帖子列表”

Screen2以“普通用户”身份查看页面“帖子列表”

Screen3以“管理员”身份查看“发布更新”页面,并带有“审核”复选框

【问题讨论】:

  • 你能比“它不起作用”更具体吗?什么不起作用?有错误吗?是否显示了不应该显示的内容?很高兴您展示了所有代码,并解释了您希望看到的行为,但您需要更好地描述实际问题。例如“当不是管理员的用户执行 X 时,会发生 Y,但应该是 Z。”或“当管理员用户点击 X 时显示此错误 Y”
  • 没有错误。我只想确定管理员可以直接在网站上审核条目 - 无需登录管理面板
  • 好的,但究竟是什么不起作用?
  • 代码没有错误。该代码显示了管理面板中帖子审核的实现。我只是不知道如何从网站页面(无需登录管理面板,例如,从网站页面“.../post//update ”,只需勾选“审核”中的复选框)

标签: python django


【解决方案1】:

如果我真的了解您的问题,您可以如下更新您的视图。

{% extends "base_generic.html" %}    
{% block title %}<title>Posts list</title>{% endblock %}
{% block content %}
    <h1>All posts</h1>
    {% if post_list %}
        <ul>
        {% for post in post_list %}
            <li><a href="{{ post.get_absolute_url }}">{{ post.title }}</a> {{ post.user }}</li> 
            {% if post.moderation and request.user.is_staff %} 
                <form action="{% url 'moderator-approval' post.pk %}" method="post">
                {% csrf_token %}
                <button type="submit">Approve</button>
            {% endif %}
        {% endfor %}
        </ul>
    {% else %}
        <p>There are no posts.</p>
    {% endif %}
{% endblock %}

在你的urls.py

urlpatterns = [ 
     path('moderator-approval/<int:post_id>/', views.moderator_approval_view, name="moderator-approval")
]

在你的views.py

def moderator_approval_view(request, **kwargs):

    if request.method == 'POST':
        post = Post.objects.get(pk=kwargs['post_id'])
        post.moderation = True
        post.save()
        return HttpResponseRedirect('posts')

【讨论】:

  • 接近真相。但是有一些错误: 1. 为了让帖子出现在“帖子列表”页面中,无论如何都需要进入管理面板并勾选“审核”。这是由于 Post (models.py) 和 get_query_set PostListView (views.py) 中的“审核”设置。好吧,让我们保持原样。我在管理面板中进行了审核。
  • 2.审核后,在“帖子列表”页面的管理面板中,条目下方出现“批准”按钮(如果以管理员身份查看)。单击它时,会出现 /blog/moderator-approval/16 'post_id' 处的 KeyError 错误。如果以普通用户或访客的身份查看此页面,所有条目都是可见的。据我了解,应该有以下内容。 1.在“帖子列表”页面,从管理员查看时,应显示所有(旧的、新的和更新的)帖子。在新的和更新的帖子下应该是“批准”按钮,点击后,帖子就会被发布。无需进入管理面板。
  • 2.在“帖子列表”页面上,从普通用户或访客查看时,应仅显示旧发布的帖子。
  • 我只是不明白你想说什么和做什么。
猜你喜欢
  • 2019-06-05
  • 2023-03-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-12
  • 1970-01-01
相关资源
最近更新 更多