Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/305.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 为什么表单._错误在generic.UpdateView中工作,但在generic.CreateView中不工作?_Python_Django_Django Forms_Mixins - Fatal编程技术网

Python 为什么表单._错误在generic.UpdateView中工作,但在generic.CreateView中不工作?

Python 为什么表单._错误在generic.UpdateView中工作,但在generic.CreateView中不工作?,python,django,django-forms,mixins,Python,Django,Django Forms,Mixins,当我在混音器中使用它时 form._errors[forms.forms.NON_FIELD_ERRORS]=ErrorList(["age must be positive"]) 在我的UpdateView中,它工作正常,消息以红色弹出。但在我看来,什么都没有出现 我怎样才能做到这一点? 这是我的mixin.py: class AgePositiveMixin(object): def form_valid(self, form): print(form.instan

当我在混音器中使用它时

form._errors[forms.forms.NON_FIELD_ERRORS]=ErrorList(["age must be positive"])
在我的UpdateView中,它工作正常,消息以红色弹出。但在我看来,什么都没有出现

我怎样才能做到这一点? 这是我的mixin.py

class AgePositiveMixin(object):
    def form_valid(self, form):
        print(form.instance.age)
        if form.instance.age>0:
            return super(AgePositiveMixin, self).form_valid(form)
        else:
            form._errors[forms.forms.NON_FIELD_ERRORS]=ErrorList(["Age must be positive"])
          # raise forms.ValidationError('Age must be positive')
        return self.form_invalid(form)

CreateView
没有
实例
,因为构建表单时对象还不存在。您可以执行以下操作,而不是
form.instance

instance = form.save(commit=False)
# perform validation here
instance.save()
return super(AgePositiveMixin, self).form_valid(form)
年龄是否应该在任何地方都是积极的(在Django管理中,面向用户的表单中)?如果是这样,a将为您进行验证

一般来说,我喜欢让验证尽可能靠近数据库。如果
PositiveSmallIntegerField
不适合您的用例,我建议使用。使用验证器,Django将在管理员、模型表单和其他任何地方为您执行验证。这对一致性很好

编辑:执行验证的另一种方法是在表单类中执行验证:

class UserForm(forms.ModelForm):
    class Meta:
        model = User

    def clean_age(self):
        age = self.cleaned_data['age']
        if not age > 0:
            raise forms.ValidationError("Age must be positive")
        return age

查看Django的文档了解更多信息。

A
CreateView
没有
实例,因为构建表单时对象还不存在。您可以执行以下操作,而不是
form.instance

instance = form.save(commit=False)
# perform validation here
instance.save()
return super(AgePositiveMixin, self).form_valid(form)
年龄是否应该在任何地方都是积极的(在Django管理中,面向用户的表单中)?如果是这样,a将为您进行验证

一般来说,我喜欢让验证尽可能靠近数据库。如果
PositiveSmallIntegerField
不适合您的用例,我建议使用。使用验证器,Django将在管理员、模型表单和其他任何地方为您执行验证。这对一致性很好

编辑:执行验证的另一种方法是在表单类中执行验证:

class UserForm(forms.ModelForm):
    class Meta:
        model = User

    def clean_age(self):
        age = self.cleaned_data['age']
        if not age > 0:
            raise forms.ValidationError("Age must be positive")
        return age

查看Django的文档,了解更多信息。

谢谢您的回答。我知道模型中的PositiverField,但我只想显示错误消息,这段代码不是真实的它';这只是一个例子。我将读取验证器文档更新,实际上是年龄字段,我可以读取并打印它,我可以检查它是否为正,并通过调用form_invalid来停止表单的验证。我的问题只是显示消息。必须有办法做到这一点。例如,如果唯一约束失败,将弹出一条内置消息。我想对客户做同样的事情condition@CHEMSEDDINEHAROUIT如果使用验证器不适合您,您可以对表单类本身中的字段执行验证。我将更新我的答案。我尝试了clean_age()验证,但它不起作用(即使创建对象的时间为负),这正是我所需要的,谢谢(我的错误是clean_age())是在Meta内。@ChemsedineHarouit很高兴我能帮上忙!谢谢你的回答。我知道模型中的PositiverField,但我只想显示错误消息,此代码不是真实的,它只是一个示例。我将读取validator doc UPDATE,实际上是年龄字段,我可以读取并打印它,我可以检查它是否为正,然后停止测试通过调用form_来验证表单无效。我的问题只是显示消息。必须有一种方法来执行此操作。例如,如果唯一约束失败,则会弹出一条内置消息。我希望对自定义执行相同的操作condition@CHEMSEDDINEHAROUIT如果使用验证器对您不起作用,您可以对我创建的字段执行验证n表单类本身。我将更新我的答案。我尝试了clean_age()验证,但它不起作用(即使创建对象的时间为负),这正是我所需要的,谢谢(我的错误是clean_age()在Meta中。@ChemsedineHarouit很高兴我能提供帮助!