建立一个参考书的网站,我做了一个博客应用程序 我发现即使是非作者也可以编辑/删除他们没写的帖子。所以我试图在很多方面修复它,但到目前为止都失败了。
这是我的代码。
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 %}
模板。
任何建议将被认真考虑。
感谢
答案 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)
。