Django执行makemigrations报ModelForm未知字段FieldError错误如何解决
问题原因
核心错误是Encounter模型的字段没有完成实例化:Django定义模型字段时,必须调用字段类的构造方法(添加括号)才能被识别为正式的数据库字段。你代码中encounter_date = models.DateField、handling_time = models.BigIntegerField这类写法,只是将字段类本身赋值给了变量,Django不会将其纳入模型的字段列表,因此迁移文件生成时不会创建这些字段,ModelForm引用这些不存在的字段时就会抛出对应的FieldError。
同时你代码还存在两处会导致后续运行报错的小问题:
Encounter的__str__方法中引用的属性名大小写错误,模型定义的外键是小写的user、animal,代码里写的self.User、self.Animal会触发属性不存在错误- views.py中返回模板的上下文参数写的是集合
{'form', form},实际需要传入字典格式
解决方案
- 修正models.py中
Encounter模型的定义:
class Encounter(models.Model): # 所有字段类后加括号完成实例化 encounter_date = models.DateField() animal = models.ForeignKey(Animal,null = True, on_delete=models.SET_NULL) user = models.ForeignKey(settings.AUTH_USER_MODEL,null = True, on_delete=models.SET_NULL) handling_time = models.BigIntegerField() crate_time = models.BigIntegerField() holding_time = models.BigIntegerField() comments = models.CharField(max_length=255) def __str__(self) -> str: # 修正属性名大小写 return ('Encounter: ' + self.user.username + '/' + self.animal.Name)
- 修正views.py中的上下文传参:
def open_encounter(request): if request.method == 'POST': form = Open_Encounter_Form(request.POST) if form.is_valid(): aRecord=form.save() return HttpResponseRedirect('/Encounter saved') else: form=Open_Encounter_Form() # 将集合改为字典格式 return render(request, 'open_encounter.html', {'form': form})
- 重新执行迁移命令即可:
python manage.py makemigrationspython manage.py migrate
内容的提问来源于stack exchange,提问作者CharleyM
相关产品推荐
相关产品推荐

