如何限制非作者的访问用户在django通用编辑视图上发帖?

时间:2017-04-16 14:47:45

标签: python django

建立一个参考书的网站,我做了一个博客应用程序 我发现即使是非作者也可以编辑/删除他们没写的帖子。所以我试图在很多方面修复它,但到目前为止都失败了。

这是我的代码。

models.py

class Post(models.Model):
    title = models.CharField('TITLE', max_length=50)
    slug = models.SlugField('SLUG', unique=True, allow_unicode=True)
    description = models.CharField('DESCRIPTION', max_length=100, blank=True)
    content = models.TextField('CONTENT')
    create_date = models.DateTimeField('Create Date', auto_now_add=True)
    modify_date = models.DateTimeField('Modify Date', auto_now=True)
    tag = TagField()
    author = models.ForeignKey(User, null=True)

    class Meta:
        ordering = ('-modify_date',) 

    def __str__(self):
        return self.title

    def get_absolute_url(self):
        return reverse('blog:post_detail', args=(self.slug,))

    def save(self, *args, **kwargs):
        if not self.id:
            self.slug = slugify(self.title, allow_unicode=True)
        super(Post, self).save(*args, **kwargs)

views.py

class PostUpdateView(LoginRequiredMixin, edit.UpdateView):
    model = Post
    fields = ['title', 'slug', 'description', 'content', 'tag']
    success_url = reverse_lazy('blog:index')

    def form_valid(self, form):
        form.instance.author = self.request.user
        return super(PostUpdateView, self).form_valid(form)


class PostDeleteView(LoginRequiredMixin, edit.DeleteView):
    model = Post
    success_url = reverse_lazy('blog:index')

    def form_valid(self, form):
        form.instance.author = self.request.user
        return super(PostDeleteView, self).form_valid(form)

下面是唯一有效的代码,我在docs中找到它(使用带有DetailView的FormMixin)

def post(self, request, *args, **kwargs):
    if not ((request.user==Post.author) or request.user.is_superuser):
        return HttpResponseForbidden()
    self.object = self.get_object()
    form = self.get_form()
    if form.is_valid():
        return self.form_valid(form)
    else:
        return self.form_invalid(form)

在某些方面,如果非作者尝试在更新表单中单击“提交”,则返回HttpResponseForbidden。但是,我想要的是非作者甚至无法访问更新页面。

我也找到了在stackoverflow中自定义dispatch()的方法,但它没有用。 我不确定在Django中是否适合在PHP中使用{% if not user == object.author %}{% else %}{% endif %}模板。 任何建议将被认真考虑。

感谢

1 个答案:

答案 0 :(得分:1)

dispatch方法是执行此操作的正确位置,因为它会影响所有请求。如您所知,将访问控制代码放在post方法中不会影响GET次请求。

您是如何尝试覆盖dispatch的?因为这样的事情应该有效:

from django.core.exceptions import PermissionDenied

class PostUpdateView(LoginRequiredMixin, edit.UpdateView):
    #
    # All of your other view code here....
    #
    def dispatch(self, request, *args, **kwargs):
        handler = super().dispatch(request, *args, **kwargs)
        user = request.user
        post = self.get_object()
        if not (post.author == user or user.is_superuser):
            raise PermissionDenied
        return handler

如果您支持Python2,则必须将super()调用更改为super(PostUpdateView, self).dispatch(request, *args, **kwargs)

相关问题