我有一个有两个实体的模型,Person
和{Person
被Code
引用两次,Person
可以是代码的user
,也可以是{
我想实现的目标是:
Person.cusman
,则无需进一步操作。在Person.cusman
,则帮助程序代码将查找Person
(来自外部数据库)的其他属性,并创建一个新的Person
实体。在我实现了一个由pre_save
信号触发的函数,它动态地创建丢失的Person
。只要我使用python manage.py shell
来创建一个不存在的Person
,它就可以正常工作。在
但是,当我尝试使用管理表单或CreateView
子体添加新的Code
时,我总是在HTML表单上得到以下验证错误:
Select a valid choice. That choice is not one of the available choices.
显然,在单击Save按钮和Code.save()
方法之间有一个验证,但我无法确定是哪一个。在pre_save
创建被引用的实体之前,我应该重写哪个方法来接受无效的外键?在
@receiver(pre_save, sender=Code)
def create_referenced_person(sender, instance, **kwargs):
def create_person_if_doesnt_exist(cusman):
try:
Person = Person.objects.get(pk=cusman)
except Person.DoesNotExist:
Person = Person()
cr = CusmanResolver()
Person_details = cr.get_person_details(cusman)
Person.cusman = Person_details['cusman']
Person.name = Person_details['name']
Person.email = Person_details['email']
Person.save()
create_Person_if_doesnt_exist(instance.user_id)
create_Person_if_doesnt_exist(instance.approver_id)
class CodeAddForm(ModelForm):
class Meta:
model = Code
fields = [
'user',
'approver',
]
widgets = {
'user': TextInput,
'approver': TextInput
}
class CodeAddView(generic.CreateView):
template_name = 'teladm/code_add.html'
form_class = CodeAddForm
您误解了一件事:您不应该使用
TextField
来填充ForeignKey,因为django外键是使用dropdown/单选按钮填充的,以引用另一个模型中对象的id
。您得到的错误意味着您提供的错误信息与另一个模型中的任何id
不匹配(在您的例子中是Person
)。在你可以做的是:不使用
ModelForm
而是Form
。在调用form.is_valid()
之后,您可能有一些额外的工作要做,但至少您可以根据需要编写逻辑代码。在相关问题 更多 >
编程相关推荐