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
相关产品推荐
相关产品推荐

