我正在使用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,也会被拒绝。
答案 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”错误,这正是您在这种情况下想要的。