2016-05-06 15 views
0

ich eine Unterkategorie Form wie dieses:Ignorieren Validierer bearbeiten Ansicht

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' 
    ) 

Der Validator Funktion sieht wie folgt aus:

def unic_subcategory(value): 
    exist = Subcategory.objects.filter(nome=value) 
    if exist: 
     raise ValidationError(u"Duplicated subcategory '%s' are not allowed" % value) 

Dies funktioniert, wenn der Benutzer eine neue Unterkategorie und eine Unterkategorie schafft mit Derselbe Name existiert bereits. Mein Problem tritt auf, wenn der Benutzer versucht, das Feld category und nicht das Feld name zu bearbeiten. Das Formular löst einen Fehler aus, da das Feld name bereits vorhanden ist.

Wie kann ich dies vermeiden, wenn der Benutzer das Feld category bearbeitet?

Antwort

1

Ein Validator ist nicht das richtige Werkzeug für diese Jobs. Validatoren sind zur Eliminierung von Inhalten gedacht, die universell ungeeignet für ein bestimmtes Feld sind. Wenn Sie komplexere Bedingungen überprüfen müssen fügen Sie eine saubere Methode:

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) 
+0

Diese Arbeit mit dem bearbeiten, aber als ich versuchte, mit einer neuen Untergruppe, die bereits existiert, gibt mir die Debug-Fehler von django/SQL, aber nicht den Formfehler . –

+1

@ M.Gar Ich habe meinen Code korrigiert. Sie haben vermutlich einen Tippfehler im queryset-Filter in Ihrem Code ('nome' statt' name'), also habe ich ihn auch in 'name' geändert. –

+0

Danke, aber jetzt gibt mir diesen Fehler ''SubcategoryForm' Objekt hat kein Attribut 'instance'' –

-2

Sie können einfach eine Validierung für category hinzufügen.

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]) 
Verwandte Themen