Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/17.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
跳过Django表单中的一个或多个约束。_是否有效()_Django_Python 3.x_Django Forms - Fatal编程技术网

跳过Django表单中的一个或多个约束。_是否有效()

跳过Django表单中的一个或多个约束。_是否有效(),django,python-3.x,django-forms,Django,Python 3.x,Django Forms,鉴于以下模型: class User(models.Model): role = models.IntegerField(default=0, blank=True) name = models.CharField(max_length=255, blank=False, null=False) email = models.EmailField(max_length=128, unique=True, blank=False, null=False) 我需要form.

鉴于以下模型:

class User(models.Model):
    role = models.IntegerField(default=0, blank=True)
    name = models.CharField(max_length=255, blank=False, null=False)
    email = models.EmailField(max_length=128, unique=True, blank=False, null=False)
我需要
form.is\u valid()
将跳过
unique
email
字段的约束

重要的是,电子邮件将是独特的,但是在一个特定的
视图中,我想使用
获取或创建
,这似乎不起作用:

if form.is_valid():
    usr, usr_created = models.User.objects.get_or_create(email=form.email)
    <...>
如果form.is_有效():
usr,usr_created=models.User.objects.get_或_create(email=form.email)
这可能吗?

这是不可能的

unique=True
创建检查字段唯一性的数据库约束。就其本身的设计而言,这不允许非唯一值,而避免这种情况的唯一方法是删除约束

如果问题是要允许多个空值,则可以设置
null=True
。约束仍然认为多个
NULL
值是唯一的。

这是不可能的

unique=True
创建检查字段唯一性的数据库约束。就其本身的设计而言,这不允许非唯一值,而避免这种情况的唯一方法是删除约束


如果问题是要允许多个空值,则可以设置
null=True
。约束仍然认为多个
NULL
值是唯一的。

不要在字段列表中列出要覆盖的字段,并在模型表单中创建新的自定义字段:

class UserForm(forms.ModelForm):
    class Meta:
        model = User
        fields = ["role", "name"]

    email = forms.EmailField(max_length=128)

    def save(self, commit=True):
        instance = super(PatientForm, self).save(commit=False)
        instance.email= self.cleaned_data.get("email")
        return instance.save(commit)

不要在“字段”列表中列出要覆盖的字段,而在ModelForm中创建新的自定义字段:

class UserForm(forms.ModelForm):
    class Meta:
        model = User
        fields = ["role", "name"]

    email = forms.EmailField(max_length=128)

    def save(self, commit=True):
        instance = super(PatientForm, self).save(commit=False)
        instance.email= self.cleaned_data.get("email")
        return instance.save(commit)

@NarūnasK这是一个完全不同的问题,我没有答案,因为你没有包括你的问题的很多细节。我敢说,这个问题仍然是一样的,我只是添加了潜在的用例:)@NarūnasK如果问题仍然是一样的,那么答案肯定也是一样的,对吗?;)无论如何,我不能告诉你为什么
get\u或\u create()
不起作用,除非你告诉它的行为与你期望的不同。我得到验证错误:
使用此电子邮件的用户已经存在。
,这是预期的,因为测试电子邮件实际上在数据库中,因此我想使用
get\u或\u create()
。我想最后我将不得不使用
form.errors
并验证除了
email
error之外是否还有其他错误。@NarūnasK这是一个完全不同的问题,我没有答案,因为你没有包括你的问题的很多细节。我敢说,这个问题还是一样的,我刚刚添加了潜在的用例:)@NarūnasK如果问题保持不变,那么答案肯定也会保持不变,对吧?;)无论如何,我不能告诉你为什么
get\u或\u create()
不起作用,除非你告诉它的行为与你期望的不同。我得到验证错误:
使用此电子邮件的用户已经存在。
,这是预期的,因为测试电子邮件实际上在数据库中,因此我想使用
get\u或\u create()
。我想最后我将不得不使用
form.errors
并验证除了
电子邮件
error之外是否还有其他错误。