【发布时间】: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 中定义了您的
EditWRModelForm?如果你有那么那是你的问题。你应该把它移到一个单独的 forms.py -
Django 加载模型的顺序与您的应用在
INSTALLED_APPS中定义的顺序相同。ForeignKey字段,当您使用字符串作为模型的引用时,会延迟加载,但是当为模型创建ModelForm时,它会检查ForeignKey字段并在模型尚未加载时引发异常然而。出于这个原因,最好在单独的 forms.py 中定义您的表单 -
哦,当一个字段不可编辑时,Django 不会为该模型字段创建表单字段
标签: django foreign-keys modelform