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

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},实际需要传入字典格式
解决方案
  1. 修正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)
  1. 修正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})
  1. 重新执行迁移命令即可:
    python manage.py makemigrations
    python manage.py migrate

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 20:45:03