Python 忽略编辑视图上的验证程序
我有这样的子类别表单:Python 忽略编辑视图上的验证程序,python,django,django-forms,Python,Django,Django Forms,我有这样的子类别表单: class SubcategoryForm(forms.Form): name = forms.CharField( widget=forms.TextInput(attrs={'class' : 'form-control'}), max_length=100, label='Subcategory', validators=[unic_subcategory] ) categor
class SubcategoryForm(forms.Form):
name = forms.CharField(
widget=forms.TextInput(attrs={'class' : 'form-control'}),
max_length=100,
label='Subcategory',
validators=[unic_subcategory]
)
category = forms.ModelChoiceField(
widget=forms.Select(attrs={'class' : 'form-control'}),
queryset = Category.objects.filter(delete=False),
label='Category'
)
def unic_subcategory(value):
exist = Subcategory.objects.filter(nome=value)
if exist:
raise ValidationError(u"Duplicated subcategory '%s' are not allowed" % value)
验证程序函数如下所示:
class SubcategoryForm(forms.Form):
name = forms.CharField(
widget=forms.TextInput(attrs={'class' : 'form-control'}),
max_length=100,
label='Subcategory',
validators=[unic_subcategory]
)
category = forms.ModelChoiceField(
widget=forms.Select(attrs={'class' : 'form-control'}),
queryset = Category.objects.filter(delete=False),
label='Category'
)
def unic_subcategory(value):
exist = Subcategory.objects.filter(nome=value)
if exist:
raise ValidationError(u"Duplicated subcategory '%s' are not allowed" % value)
当用户创建一个新的子类别并且已经存在同名的子类别时,此操作有效。当用户试图编辑类别
字段而不是名称
字段时,就会出现我的问题。表单引发错误,因为名称
字段已存在
当用户编辑
类别
字段时,如何避免出现这种情况?您只需为类别
添加验证即可
def unic_subcategory(name, categ):
subc_name = Subcategory.objects.filter(name=name)
subc_categ = Subcategory.objects.filter(categ=categ)
if all([exist, categ]):
raise ValidationError(u"Duplicated subcategory '%s' and category %s are not allowed" % [name, categ])
验证器不是此作业的正确工具。验证器用于消除普遍不适合给定字段的内容。如果需要检查更复杂的条件,请添加一个干净的方法:
def clean_name(self):
value = self.cleaned_data.get('name')
if self.instance and self.instance.name == value:
return # name didn't change, skip the check
if Subcategory.objects.filter(name=value).exists():
raise ValidationError(u"Duplicated subcategory '%s' is not allowed" % value)
这可以使用编辑,但是当我尝试使用一个已经存在的新子类别时,django/sql给了我调试错误,而不是表单错误。@M.Gar我更正了我的代码。我猜您的代码中的queryset筛选器中有一个输入错误(
nome
,而不是name
),因此我也将其更改为name
。谢谢,但是现在给了我这个错误,'SubcategoryForm'对象没有属性'instance'
好的,只需更改clean_数据的def clean_name
,并获取instance
,谢谢