只允许帖子的作者在基于类的视图中编辑 - Django?

时间:2017-03-07 13:45:28

标签: python django

views.py

class EditPost(UserPassesTestMixin, LoginRequiredMixin, UpdateView):
    model = Posts
    form_class = PostForm
    template_name="posts/add_post.html"

    def test_func(self):
        x = self.request.user.pk
        print (x)
        y = Posts.objects.get(user='user')
        print (y)
        if x == y:
            return True
        else:
            if self.request.user.is_authenticated():
                raise Http404("You are not allowed to edit this Post")

models.py

class Posts(models.Model):
    user = models.ForeignKey(settings.AUTH_USER_MODEL, default=1)
    post = models.CharField(max_length=1200, blank=False)

如何匹配登录用户和帖子的用户对象

我找不到任何解决方案,因为我使用的是基于类的视图。

3 个答案:

答案 0 :(得分:1)

签入test_func非常棘手。您需要在test_func中获取一次对象以检查是否允许用户使用它,然后由同一个fiew再次获取该对象。

更简单的方法是覆盖get_queryset方法。如果用户不是帖子的作者,他们将获得404。

class EditPost(LoginRequiredMixin, UpdateView):
    def get_queryset(self):
        return super(EditPost, self).filter(user=self.request.user)

答案 1 :(得分:1)

试试这个:

将调度添加到EditPost类

def dispatch(self, request, *args, **kwargs):
    obj = self.get_object()
    if obj.user != self.request.user:
        return Http404("You are not allowed to edit this Post")
    return super(EditPost, self).dispatch(request, *args, **kwargs)

答案 2 :(得分:1)

要添加到以前的帖子中,请尝试以下操作:

添加到您的班级EditPost:

login_url = 'your url name or path to login page'
def test_func(self):
    obj = self.get_object()
    return obj.author == self.request.user

test_func使用UserPassesTestMixin方法来实现此特定逻辑。要覆盖它,我们使用obj将变量get.object()设置为视图返回的当前对象。 之后,如果当前对象(obj.author)上的作者与当前用户(self.request.user)相匹配,则允许进行编辑。如果不是这样(即false),我们会抛出一个错误。

login_url来自LoginRequiredMixin,默认位置为/accounts/login。要覆盖它,请设置您自己的路径或登录模板的名称。这样会将那些尚未登录到登录页面的人带走。