2016-03-30 15 views
1

Ich bin nur ein paar Tage Neuling in Django. Jetzt muss ich sowohl den Wert als auch die Repräsentation in einem Feld ändern, wenn sich der Wert eines anderen Feldes in benutzerdefinierter Form ändert. Und an diesem Punkt ändert sich MyModel eingeschränkt.Django Formular Customizing: ändern Feld auf anderen Feld ändern

myapp/models.py:

class MyModel(models.Model): 
    somefield = models.IntegerField(default=0) 

myapp/forms.py

class MyModelForm(models.Model): 
    someformfield = models.BooleanField(required=False) 
    // Here it should be smth as following: 
    // def clean(..), or def save(..), or def __init__(..) 
    if MyModelForm.is_valid(): 
     # This if-else construction further should 'raise' on every change of 'someformfield'-checkbox: 
     if someformfield == True: 
      somefield = 0 
      self.fields['somefield'].widget = forms.HiddenInput() 
     else: 
      somefield = data['somefield'] # Just to use User Input 
      self.fields['somefield'].widget = forms.ShownInput() # What's wrong, but I just need to abort HiddenInput somehow - so, how shoulda do it? 

versuchte ich definieren clean() wie folgt, aber es tat nichts, auch nicht Formen aufwarf. Validation:

def clean(MyModelForm, self): 
    cleaned_data = super(MyModelForm, self).clean() 

    if self.cleaned_data['someformfield']: 
     if self.cleaned_data['somefield'] != 0: 
      # This didn't work 
      raise forms.ValidationError(
       "Error!" 
      ) 
      # And following also didn't work 
      self.cleaned_data['somefield'] = 0 
      self.fields['somefield'].widget = forms.HiddenInput() 

Und das auch nicht funktioniert hat:

def clean(MyModelForm, self): 
    cleaned_data = super(MyModelForm, self).clean() 
    somefield = cleaned_data.get("somefield") 
    someformfield = cleaned_data.get("someformfield") 

     if someformfield: 
      # Also not working 
      if somefield != 0: 
       raise forms.ValidationError(
        "Error!" 
       ) 
      # Also not working 
      somefield = 0 
      self.fields['somefield'].widget = forms.HiddenInput() 

Wahrscheinlich sollte ich eine andere Methode verwenden - speichern (..) oder init (..), oder was auch immer, bekam aber völlig in docs verwirrt und keine Ahnung haben, was ist der Zweck jedes dieser Methoden. Welche Methode sollte ich hier verwenden und wie?

+0

Ihre saubere Methode sollte 'def clean (self) sein:' –

+0

Was ist 'myform'? –

+0

Nur falsch geschrieben, sorry. Behoben. – Dilemma

Antwort

0

clean Methode sollte nur ein Argument akzeptieren, das war self.

class MyModelForm(models.Model): 
    someformfield = models.BooleanField(required=False) 

    def clean(self): 
     cleaned_data = self.cleaned_data 
     # do the work you want ... 
+0

Vielen Dank! Könnten Sie mir jetzt sagen, wie Sie Jquery auf der clean() -Methode verwenden können, um "somefield" ein- und auszublenden, wenn das Kontrollkästchen "someformfield" aktiviert/deaktiviert wurde, ohne dass die Seite neu geladen wurde? – Dilemma

+0

@Freeky denken, dass Sie jQuery onclick Funktion verwenden können, um bestimmte Teile auf Element markiert/nicht markiert zu zeigen/ausblenden. –

+0

Und dann, wenn ich noch 'self.fields ['somefield']. Widget = forms.HiddenInput()' innen clean (self) -Methode oder schon nicht? – Dilemma

Verwandte Themen