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
,谢谢