创建文章时无法关联用户至Author模型,请求自动分配作者权限协助
解决自动分配文章作者及作者专属修改权限问题
一、消除作者分配时的异常隐患
当前代码中,若登录用户未关联Author实例,self.request.user.author会直接抛出异常。通过Django信号实现用户创建时自动生成对应Author:
在models.py末尾添加信号绑定代码:
from django.db.models.signals import post_save from django.dispatch import receiver from django.contrib.auth.models import User @receiver(post_save, sender=User) def create_author_profile(sender, instance, created, **kwargs): if created: Author.objects.create(author_user=instance) @receiver(post_save, sender=User) def save_author_profile(sender, instance, **kwargs): instance.author.save()
二、修复文章创建时的作者分配逻辑
修改views.py中NewsCreate的form_valid方法,补充多对多关系的手动保存(commit=False时不会自动处理多对多):
def form_valid(self, form): post = form.save(commit=False) post.category_type = 'NW' post.author = self.request.user.author post.save() # 手动保存分类的多对多关联 form.save_m2m() send_email_task.delay(post.pk) return super().form_valid(form)
三、实现仅作者可修改的权限控制
创建文章更新视图,限制仅作者本人能访问修改页面,并控制作者字段的编辑权限:
在views.py中添加更新视图:
class NewsUpdate(PermissionRequiredMixin, UpdateView): permission_required = ('news.change_post',) form_class = NewsForm model = Post template_name = 'news_update.html' # 仅返回当前用户作为作者的文章,非作者无法访问修改页面 def get_queryset(self): return super().get_queryset().filter(author__author_user=self.request.user) # 禁用作者字段编辑,防止作者误修改文章归属 def get_form(self, form_class=None): form = super().get_form(form_class) form.fields['author'] = forms.ModelChoiceField(queryset=Author.objects.all(), disabled=True) return form def form_valid(self, form): post = form.save(commit=False) post.save() form.save_m2m() return super().form_valid(form)
同时修改forms.py的NewsForm,添加author字段(编辑时由视图控制权限,创建时自动赋值无需显示):
class NewsForm(forms.ModelForm): heading = forms.CharField(max_length=40) content = forms.CharField(min_length=20) class Meta: model = Post fields = [ 'heading', 'categoryPost', 'content', 'author' ]
额外说明
- 信号逻辑确保每个新用户都自动拥有对应
Author实例,避免作者分配时的异常。 get_queryset的过滤逻辑直接拦截非作者用户的修改请求,从根源控制访问权限。- 若业务允许作者修改文章的作者归属,可删除
form.fields['author']的disabled=True设置。
内容的提问来源于stack exchange,提问作者ROMTAISN
相关产品推荐
相关产品推荐

