Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Can';t在Django 1.9中禁用ForeignKey引用完整性检查_Python_Django_Django Models_Django Forms - Fatal编程技术网

Python Can';t在Django 1.9中禁用ForeignKey引用完整性检查

Python Can';t在Django 1.9中禁用ForeignKey引用完整性检查,python,django,django-models,django-forms,Python,Django,Django Models,Django Forms,我有一个包含两个实体的模型,Person和code人员被代码引用两次,人员可以是代码的用户,也可以是审批人 我希望实现以下目标: 如果用户提供了现有的Person.cusman,则无需进一步操作 如果用户提供了一个未知的Person.cusman,则助手代码将查找Person的其他属性(从外部数据库),并创建一个新的Person实体 我已经实现了一个由pre_save信号触发的功能,它会动态创建缺少的人员。只要我使用python manage.py shell创建一个不存在Person的co

我有一个包含两个实体的模型,
Person
code
<代码>人员被
代码
引用两次,
人员
可以是代码的
用户
,也可以是
审批人

我希望实现以下目标:

  • 如果用户提供了现有的
    Person.cusman
    ,则无需进一步操作
  • 如果用户提供了一个未知的
    Person.cusman
    ,则助手代码将查找
    Person
    的其他属性(从外部数据库),并创建一个新的
    Person
    实体
我已经实现了一个由
pre_save
信号触发的功能,它会动态创建缺少的
人员。只要我使用
python manage.py shell
创建一个不存在
Person
code
,它就可以正常工作

但是,当我尝试使用管理表单或
CreateView
子体添加新的
code
时,我总是在HTML表单上遇到以下验证错误:

Select a valid choice. That choice is not one of the available choices.
显然,在单击Save按钮和
code.Save()
方法之间会发生验证,但我无法确定是哪个方法。在
pre\u save
创建引用的实体之前,您能帮助我覆盖哪种方法来接受无效的外键吗

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


您可以做的是:不使用
ModelForm
,而是使用
Form
。调用
form.is valid()
之后,您可能还有一些额外的工作要做,但至少您可以按照自己的意愿编写逻辑。

实际上,我可以使用
CharField
扩展
ModelForm
,然后重写
save()
方法来实现建议的登录。谢谢
class Person(models.Model):
    cusman = models.CharField(
        max_length=10,
        primary_key=True)
    name = models.CharField(max_length=30)
    email = models.EmailField()

    def __unicode__(self):
        return u'{0} ({1})'.format(self.name, self.cusman)


class Code(models.Model):
    user = models.ForeignKey(
        Person,
        on_delete=models.PROTECT,
        db_constraint=False)
    approver = models.ForeignKey(
        Person,
        on_delete=models.PROTECT,
        related_name='approves',
        db_constraint=False)
@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