You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

创建文章时无法关联用户至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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 22:43:24