Django编写的通用更新视图仅限于某些用户

时间:2017-04-04 14:07:00

标签: python django

我正在使用django构建一个小博客。我想构建一个允许帖子作者删除和更新自己帖子的功能。 然后我发现django有LoginMixin用于通用视图,但它只阻止那些不登录的人。

我的文章模型如下

class Article(models.Model):
    author = models.ForeignKey(User)
    updated = models.DateTimeField(auto_now=True)
    created = models.DateTimeField(auto_now_add=True)
    title = models.CharField(max_length=50)
    context = models.TextField()

    genre_choice = (('O','Others'),('P','Programming'),('L','Learning'),('E','Entertainment'))

    genre = models.CharField(max_length=2,choices=genre_choice,default='O')
    def __str__(self):
        return "{} - {}".format(self.title,self.author)

    def get_absolute_url(self):
        return reverse("article-detail",args=str(self.id))

这是通用文章详细信息视图。

class ArticleDetail(DetailView):
    model = Article

我首先要在详细信息模板中添加这样的内容:

{% if article.author == user.username%}
 <!-- Some a tag that directs to the update view -->
{% endif %}

然后我意识到这只是隐藏了一个标签,它无法阻止其他用户触摸更新网址只需更改网址。

django是否可以通过简单地使用通用视图来限制更新和删除原始用户的权限?即使他们直接输入更新URL,也会被拒绝。

3 个答案:

答案 0 :(得分:3)

覆盖get_queryset中的UpdateView,以便用户只能访问他们创作的内容。使用LoginRequiredMixin确保只有登录用户才能访问该视图。

from django.contrib.auth.mixins import LoginRequiredMixin

class UpdateArticle(LoginRequiredMixin, UpdateView):
    model = Article

    def get_queryset(self):
        queryset = super(UpdateArticle, self).get_queryset()
        queryset = queryset.filter(author=self.request.user)
        return queryset

在模板中,我会将author_id与用户的主键进行比较,以决定是否显示链接。

{% if article.author_id == user.pk %}

答案 1 :(得分:0)

一个选项是创建自己的mixin / decorator来检查记录的用户是否是作者,如果没有则重新加载/显示消息等。

答案 2 :(得分:0)

我相信现在更安全的方法是使用内置的 mixin UserPassesTestMixin。特别是,您可以在您的类中继承它并更改其 test_func() 以检查作者。不要忘记还继承 LoginRequiredMixin 以确保用户已登录:

from django.contrib.auth.mixins import LoginRequiredMixin, UserPassesTestMixin

class UpdateArticle(LoginRequiredMixin, UserPassesTestMixin, UpdateView):
    model = Article

    def test_func(self):
        thisArticle = self.get_object()
        if self.request.user == thisArticle.author:
            return True
        return False

如果不是作者的用户尝试更新文章,则会返回“403 Forbidden”错误,这正是您在这种情况下想要的。