【问题标题】:ModelForm foreignkey field not loaded yetModelForm 外键字段尚未加载
【发布时间】:2017-12-06 00:41:24
【问题描述】:

我正在尝试开发一种工作记录跟踪器类的应用程序,非常类似于票务跟踪器。每张“工单”可以有多个员工拥有的笔记(员工在安装到工单跟踪器中的不同应用程序中进行跟踪)。

MySite
  |___WorkRecords
     |__models.py
     |__views.py
     |__etc..    //standard app stuff
  |___emp #the uncreative name for the employee manager app
     |__         //standard stuff again...

在模型内:

WorkRecords.models.py

class WorkRecord(models.Model):
    issuedate = models.DateField('date first issued',
             editable = False, default = timezone.now)
    owner = models.ForeignKey('emp.Employee', related_name='work_owner',
            on_delete=models.PROTECT)
    other_irrelevant_header_data...

    ....

class WorkRecordNote(models.Model):
    ref_wr = models.ForeignKey(WorkRecord, on_delete=models.CASCADE)
    note_text = models.CharField(max_length=1000)
    author = models.ForeignKey('emp.Employee', related_name='note_author',
            on_delete=models.PROTECT)

#Form class for the Work Record
class EditWR(ModelForm):
    class Meta:
        model = WorkRecord
        fields = '__all__'

emp.models.py

class Employee(models.Model)
    data stuff

目前模型已经全部迁移,但是数据还没有输入到表中(mysql表都在了,匹配模型等等……但是表中还没有数据)

现在我已经获得了模型并尝试了 modelform,我尝试了 makemigrations,但是我得到了一个错误回溯...

ValueError: Cannot create form field for 'owner', because its related model u'emp.Employee' 尚未加载

我检查了我的 mysite/settings.py 以确保应用程序已安装,并且配置文件都在那里:

...
INSTALLED_APPS = [
    'WorkRecords.apps.WorkrecordsConfig',
    'emp.apps.EmpConfig',
    etc...
]
...

对我来说,这听起来像是它无法创建表单,因为没有任何数据“加载”到数据库中,但我对 Django 的了解表明它不应该关心。那准确吗?还是我还缺少其他东西?

编辑: 我对 WorkRecord 的模型进行了更改,这在一定程度上解决了问题(至少错误不再存在,但我不知道副作用)

class WorkRecord(models.Model):
    ...
    owner=models.ForeignKey('emp.Employee', related_name='work_owner',
            on_delete=models.PROTECT, editable=False) #Added the editable=False
    ...

其他一切都保持不变,但这次 makemigrations 没有抛出错误。这是什么原理?

【问题讨论】:

  • INSTALLED_APPS 应该是一个字符串列表,这些字符串是您的应用程序的绝对路径。您确定您已正确粘贴您的INSTALLED_APPS 设置吗?
  • @IainShelvington 抱歉,我的帖子在mysite/settings.py 中有错字,所有应用程序在我的实际设置文件中都列为字符串。我将编辑帖子以准确反映这一点。
  • 您是否在您的models.py 中定义了您的EditWR ModelForm?如果你有那么那是你的问题。你应该把它移到一个单独的 forms.py
  • Django 加载模型的顺序与您的应用在 INSTALLED_APPS 中定义的顺序相同。 ForeignKey 字段,当您使用字符串作为模型的引用时,会延迟加载,但是当为模型创建 ModelForm 时,它会检查 ForeignKey 字段并在模型尚未加载时引发异常然而。出于这个原因,最好在单独的 forms.py 中定义您的表单
  • 哦,当一个字段不可编辑时,Django 不会为该模型字段创建表单字段

标签: django foreign-keys modelform


【解决方案1】:

尝试更改已安装应用的顺序:

INSTALLED_APPS = [
    emp.apps.EmpConfig, # first
    WorkRecords.apps.WorkrecordsConfig,
    etc...
]

【讨论】:

  • 令人惊讶的是,这奏效了。为什么安装的应用程序的顺序很重要?那么在emp/models.py 中是否不可能有一个使用来自workrecords/models.py 的ForeignKey 的表单?
猜你喜欢
  • 2016-05-25
  • 1970-01-01
  • 1970-01-01
  • 2020-07-06
  • 2011-08-08
  • 2015-08-26
  • 1970-01-01
  • 1970-01-01
  • 2014-09-02
相关资源
最近更新 更多