我正在使用 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))
Run Code Online (Sandbox Code Playgroud)
这是通用文章详细信息视图。
class ArticleDetail(DetailView):
model = Article
Run Code Online (Sandbox Code Playgroud)
我首先想在细节模板中添加这样的东西:
{% if article.author == user.username%}
<!-- Some a tag that directs to the update view -->
{% endif %}
Run Code Online (Sandbox Code Playgroud)
然后我意识到这只是隐藏了 a 标签,它无法阻止其他用户触摸更新 url 只需更改 url。
django 有没有什么办法可以通过简单的通用视图来限制原始用户的更新和删除权限? 即使他们直接输入更新 url 也会被拒绝。
覆盖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
Run Code Online (Sandbox Code Playgroud)
在模板中,我会将author_id与用户的主键进行比较来决定是否显示链接。
{% if article.author_id == user.pk %}
Run Code Online (Sandbox Code Playgroud)