0

我对 Django 还很陌生,现在对 Django 的概念还不是很熟悉。我创建了一个用户板(来自 simpleisbetterthancomplex.com),并希望使用“is_staff”用户实施审核。

目前,只有创建帖子/评论的用户才能编辑帖子。作为 is_staff 用户,我还希望能够编辑所有帖子/评论。

这是编辑按钮:

        {{ post.message }}
        {% if post.created_by == user %}
          <div class="mt-3">
            <a href="{% url 'edit_post' post.topic.board.pk post.topic.pk post.pk %}"
               class="btn btn-primary btn-sm"
               role="button">Edit</a>
          </div>
        {% endif %}

我以为我可以这样:

        {{ post.message }}
        {% if user.is_staff %}
          <div class="mt-3">
            <a href="{% url 'edit_post' post.topic.board.pk post.topic.pk post.pk %}"
               class="btn btn-primary btn-sm"
               role="button">Edit</a>
          </div>
        {% endif %}

虽然我到达了正确的超链接来编辑帖子,但我收到“找不到页面”错误。

有什么方法可以对我的论坛实施一些审核?

4

3 回答 3

1

很难判断您的代码有什么问题。似乎两个代码示例都应该显示相同的按钮。

请注意,在这种情况下,您可能应该使用单个按钮和标签,方法是将 if 更改为稍微复杂的{% if user.is_staff or post.created_by == user %}. 这应该具有消除两个按钮之间所有可能的差异的附加效果。


如果您只想编辑/删除帖子,那么最简单的方法可能是使用内置的 django 管理面板。如果您使用过django startproject,那么您的应用程序已经有一个!尝试去localhost:8000/admin(默认情况下)检查它。

https://docs.djangoproject.com/pl/2.1/ref/contrib/admin/


编辑:我想我可以看到问题。您在 PostUpdateView 中过滤查询集(created_by=self.request.user)。当与不同的用户(例如版主)打交道时,此过滤器的工作方式有所不同。尝试更改视图以反映这一点。

于 2018-10-18T15:11:21.220 回答
1

问题是 edit_post 返回的 URL。此视图仅允许帖子所有者访问,因此其他人无法访问此视图。

您需要添加到视图以允许 is_staff = True 的用户也访问此视图。

问题在于查询集定义过滤掉了不是由用户创建的模型。但是您想保留它,以便其他用户无权访问。

您可以删除 get_queryset 调用并调整调度方法以仅允许所有者或工作人员查看。但我建议保持原样并添加一个新的版主更新视图并使用 django 大括号来整理权限。就像是;

from braces.views import StaffuserRequiredMixin


class ModeratorUpdateView(LoginRequiredMixin, 
                          StaffuserRequiredMixin,
                          UpdateView):
    ## Update Code here ##
于 2018-10-18T15:15:09.267 回答
0

我的董事会观点:

class BoardListView(ListView):
    model = Board
    context_object_name = 'boards'
    template_name = 'home.html'


class TopicListView(ListView):
    model = Topic
    context_object_name = 'topics'
    template_name = 'topics.html'
    paginate_by = 5

    def get_context_data(self, **kwargs):
        kwargs['board'] = self.board
        return super().get_context_data(**kwargs)

    def get_queryset(self):
        self.board = get_object_or_404(Board, pk=self.kwargs.get('pk'))
        queryset = self.board.topics.order_by('-last_updated').annotate(replies=Count('posts') - 1)
        return queryset


@login_required
def new_topic(request, pk):
    board = get_object_or_404(Board, pk=pk)
    if request.method == 'POST':
        form = NewTopicForm(request.POST)
        if form.is_valid():
            topic = form.save(commit=False)
            topic.board = board
            topic.starter = request.user  # <- here
            topic.save()
            Post.objects.create(
                message=form.cleaned_data.get('message'),
                topic=topic,
                created_by=request.user  # <- and here
            )
            return redirect('topic_posts', pk=pk, topic_pk=topic.pk)  # TODO: redirect to the created topic page
    else:
        form = NewTopicForm()
    return render(request, 'new_topic.html', {'board': board, 'form': form})


def topic_posts(request, pk, topic_pk):
    topic = get_object_or_404(Topic, board__pk=pk, pk=topic_pk)
    topic.views += 1
    topic.save()
    return render(request, 'topic_posts.html', {'topic': topic})


@login_required
def reply_topic(request, pk, topic_pk):
    topic = get_object_or_404(Topic, board__pk=pk, pk=topic_pk)
    if request.method == 'POST':
        form = PostForm(request.POST)
        if form.is_valid():
            post = form.save(commit=False)
            post.topic = topic
            post.created_by = request.user
            post.save()

            topic.last_updated = timezone.now()
            topic.save()

            topic_url = reverse('topic_posts', kwargs={'pk': pk, 'topic_pk': topic_pk})
            topic_post_url = '{url}?page={page}#{id}'.format(
                url=topic_url,
                id=post.pk,
                page=topic.get_page_count()
            )

            return redirect(topic_post_url)
    else:
        form = PostForm()
    return render(request, 'reply_topic.html', {'topic': topic, 'form': form})


@method_decorator(login_required, name='dispatch')
class PostUpdateView(UpdateView):
    model = Post
    fields = ('message', )
    template_name = 'edit_post.html'
    pk_url_kwarg = 'post_pk'
    context_object_name = 'post'

    def get_queryset(self):
        queryset = super().get_queryset()
        return queryset.filter(created_by=self.request.user)

    def form_valid(self, form):
        post = form.save(commit=False)
        post.updated_by = self.request.user
        post.updated_at = timezone.now()
        post.save()
        return redirect('topic_posts', pk=post.topic.board.pk, topic_pk=post.topic.pk)


class PostListView(ListView):
    model = Post
    context_object_name = 'posts'
    template_name = 'topic_posts.html'
    paginate_by = 20

    def get_context_data(self, **kwargs):

        session_key = 'viewed_topic_{}'.format(self.topic.pk)
        if not self.request.session.get(session_key, False):
            self.topic.views += 1
            self.topic.save()
            self.request.session[session_key] = True

        kwargs['topic'] = self.topic
        return super().get_context_data(**kwargs)

    def get_queryset(self):
        self.topic = get_object_or_404(Topic, board__pk=self.kwargs.get('pk'), pk=self.kwargs.get('topic_pk'))
        queryset = self.topic.posts.order_by('created_at')
        return queryset

和models.py:

from django.db import models
from django.contrib.auth.models import User
from django.utils.text import Truncator
import math


class Board(models.Model):
    name = models.CharField(max_length=30, unique=True)
    description = models.CharField(max_length=100)

    def __str__(self):
        return self.name

    def get_posts_count(self):
        return Post.objects.filter(topic__board=self).count()

    def get_last_post(self):
        return Post.objects.filter(topic__board=self).order_by('-created_at').first()


class Topic(models.Model):
    subject = models.CharField(max_length=255)
    last_updated = models.DateTimeField(auto_now_add=True)
    board = models.ForeignKey(Board, on_delete=models.CASCADE, related_name='topics')
    starter = models.ForeignKey(User, on_delete=models.CASCADE, related_name='topics')
    views = models.PositiveIntegerField(default=0)  # <- here

    def __str__(self):
        return self.subject

    def get_page_count(self):
        count = self.posts.count()
        pages = count / 20
        return math.ceil(pages)

    def has_many_pages(self, count=None):
        if count is None:
            count = self.get_page_count()
        return count > 6

    def get_page_range(self):
        count = self.get_page_count()
        if self.has_many_pages(count):
            return range(1, 5)
        return range(1, count + 1)

    def get_last_ten_posts(self):
        return self.posts.order_by('-created_at')[:10]


class Post(models.Model):
    message = models.TextField(max_length=4000)
    topic = models.ForeignKey(Topic, on_delete=models.CASCADE, related_name='posts')
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(null=True)
    created_by = models.ForeignKey(User, on_delete=models.CASCADE, related_name='posts')
    updated_by = models.ForeignKey(User, on_delete=models.CASCADE, null=True, related_name='+')

    def __str__(self):
        truncated_message = Truncator(self.message)
        return truncated_message.chars(30)
于 2018-10-18T15:20:59.867 回答