无法在Django1.9中禁用ForeignKey引用完整性检查

2024-10-01 02:25:32 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个有两个实体的模型,Person和{}。PersonCode引用两次,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创建被引用的实体之前,我应该重写哪个方法来接受无效的外键?在

在模型.py在

^{pr2}$

在信号.py在

@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)

在视图.py在

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

Tags: instancepy实体ifsavecreatecodedetails
1条回答
网友
1楼 · 发布于 2024-10-01 02:25:32

您误解了一件事:您不应该使用TextField来填充ForeignKey,因为django外键是使用dropdown/单选按钮填充的,以引用另一个模型中对象的id。您得到的错误意味着您提供的错误信息与另一个模型中的任何id不匹配(在您的例子中是Person)。在

你可以做的是:不使用ModelForm而是Form。在调用form.is_valid()之后,您可能有一些额外的工作要做,但至少您可以根据需要编写逻辑代码。在

相关问题 更多 >