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

Django类视图中模型表单字段赋值当前登录用户报错处理

问题描述

在Django项目开发中,尝试保存关联当前登录用户名的表单时触发如下报错:

Cannot assign "'Neshno_Games2'": "League.host" must be a "Manager" instance.

涉及的项目代码如下:

相关代码

Views.py

class CreateLeaguesView(generic.CreateView):
    model = League
    template_name = "leagues/create-league.html"
    form_class = LeaguesCreationForm
    success_url = "/leagues/leagues"

    def get_context_data(self, **kwargs):
        context = super().get_context_data( **kwargs)
        context['leagues'] = League.objects.all()
        return context

    def form_valid(self, form):
        manager = self.request.user.username
        League.objects.create(
            host = manager,
        )
        return super(CreateLeaguesView, self).form_valid(form)

Model.py

class League(models.Model):
    name = models.CharField(max_length=30)
    no_players = models.IntegerField(default=20)
    start_date = models.DateField(blank=False, null=False)
    end_date = models.DateField(blank=False, null=False)
    prize = models.CharField(max_length=300)
    host = models.ForeignKey(Manager, on_delete=models.CASCADE)

    def __str__(self):
        return self.name

forms.py

class LeaguesCreationForm(forms.ModelForm):
    class Meta:
        model = League
        fields = (
            "name",
            "no_players",
            "start_date",
            "end_date",
            "prize",
        )
报错原因
  • host是League模型上指向Manager模型的外键字段,该字段赋值时必须传入Manager模型实例,不能直接传入字符串类型的用户名。当前代码中self.request.user.username返回的是字符串值,和外键要求的字段类型不匹配,直接触发报错。
  • 现有form_valid方法存在逻辑问题:手动调用League.objects.create()时仅传入了host参数,其余表单字段(名称、赛事时间、奖金等)均未传值,会触发数据库非空约束报错;后续调用父类form_valid方法会再次执行数据库写入操作,生成重复的联赛记录。
修复方法
  • 获取当前登录用户对应的Manager实例,不要取用户名字符串:
  • 如果Manager是配置在AUTH_USER_MODEL中的自定义用户模型,self.request.user本身就是合法的Manager实例,可以直接使用
  • 如果Manager是通过一对一字段和Django默认User模型关联的扩展模型,先通过关联关系查询到对应的Manager实例即可
  • 移除手动调用League.objects.create()的冗余逻辑,直接给当前表单绑定的模型实例赋值host字段,交给父类方法统一完成保存,避免重复写入和字段缺失问题。

修复后的form_valid方法代码如下:

def form_valid(self, form):
    # 若Manager是和默认User一对一关联的模型,替换为 manager = Manager.objects.get(user=self.request.user)
    form.instance.host = self.request.user
    return super().form_valid(form)

内容的提问来源于stack exchange,提问作者Dullah

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 19:18:26