2016-03-30 5 views
1

私はDjangoの初心者初心者です。今私は、カスタムフォームの他のフィールドの値が変更されているときに、1つのフィールドで値と表現の両方を変更する必要があります。そして、この時点でMyModelはが制限されています。です。Djangoフォームのカスタマイズ:他のフィールドのフィールドを変更する

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? 

は、私は()のような、次のクリーン定義しようとしたが、それは何もしませんでした。 ValidationErrorを:

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

そして、これは同様に動作しませんでした:

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

おそらく、私はいくつかの他の方法を使用する必要があります - (..)保存またはのinit(..)、または何が、ドキュメントで完全に混乱しましたとは考えている、これらのそれぞれの目的は何でありますメソッド。だから私はここでどの方法を使うべきですか?

+0

クリーンメソッドは 'def clean(self):' –

+0

である必要があります。 'myform'とは何ですか? –

+0

ちょうどスペルミス、申し訳ありません。修正しました。 – Dilemma

答えて

0

cleanメソッドは、selfの引数を1つだけ受け入れる必要があります。

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

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

ありがとうございました!さて、 'someformfield'チェックボックスがページの再読み込みなしでdinamicallyチェック/チェックされていないときに、 'somefield'を隠す/表示するclean()メソッドでJqueryを使用する方法を教えてください。 – Dilemma

+0

@Freeky jqueryのonclick関数を使用して、項目の特定の部分を表示/非表示にすることができます。 –

+0

そして、まだ 'self.fields ['somefield']。widget = forms.HiddenInput()'がクリーン(self)メソッドの中にあるか、まだ存在しないのでしょうか? – Dilemma

関連する問題