2016-10-10 2 views
0

Ich muss mehrere ModelField-Werte aus einem FormField extrahieren. wo soll ich das machen? in clean_<field> Funktionen? mit cleaned_data Mutation? Formular __init__ Funktion? in model.save oder form.save Funktion?Mehrere Modellfelder aus einem Formularfeld berechnen

Modell:

def normalize_name(name): 
    # some code 
    return name 

class MyModel(models.Model): 
    name   = models.CharField(max_length=250) 
    normalize_name = models.CharField(max_length=250, unique=True) 

Form:

class MyForm(forms.ModelForm): 
    class Meta: 
     model = MyModel 
     fields = ('name',) # or normalize_name? or both? 
+0

Ich bin mir nicht sicher, was Sie meinen "durch Extrahieren mehrerer ModelField-Wert von einem FormField". Wenn Sie aber "normalize_name" im Formular haben wollen, sollten Sie es in die Felder tuple too einfügen .... ('name', 'normalize_name',) ... –

+0

Benutzer geben nur 'name' im HTML-Formular ein . aber im Modell brauchen sowohl 'name' als auch' normalisierte_name' Validierung. 'normalized_name' muss aus' name' berechnet und validiert werden. – seyed

Antwort

0

nach Ihrem Kommentar würde ich das Zeug in der save() Funktion tun.

__init__(self) wird vor der Eingabe der Daten in das Formular aufgerufen, so dass es nichts mit Attributen tun kann.

Theoretisch könnte clean_name funktionieren (meiner Meinung nach), aber es sollte für die Validierung verwendet werden.

Die save() Methode wird nach dem name genannte Attribut validiert, so dass Sie die name bekommen und ein paar Sachen mit ihm (normalize_name (name)) tun

def save(self, user, *args, **kwargs): 
    name = self.cleaned_data['name'] 
    self.instance.normalized_name = normalize_name(name) 
    return super(YourFormClass, self).save(*args, **kwargs) 

Wenn Sie meinen, dass Sie normalized_name mit name erzeugen und Das Formular ist gültig, wenn normalized_name einige Bedingungen erfüllt, in clean_name (self).

def clean_name(self): 
    name = self.cleaned_data['name'] 
    normalized_name = normalize(name) 
    if not validate(normalized_name): 
     raise ValidationError("Something is wrong) 
    return name 
Verwandte Themen