2011-01-01 3 views
14

制限付きフォームでis_valid()が必要なデータがすべて入力されているかどうかを確認しています。これは私が望むものではありません。 フィールドがフォームに入力されているかどうかを確認したいと思います。Django:ユーザーがすべてのフィールドを空白(または初期値)にしたかどうかを確認する方法は?

アイデア?

エラボレーション:

私は、ユーザーにまったくフォームに記入しない選択肢を与えたいです。ただし、フィールドの値を入力しようとすると(つまり、フィールドの値を初期値(通常は空の値)に変更した場合)、そのフィールドを検証したいと考えています。

ビューはこのようなものになるだろう:私が欲しいもの

def get_opinion(request): 

    if request.method == 'POST': 
     f = OpinionForm(request.POST) 
     if form_is_blank(f): 
      return HttpResponseRedirect(reverse('thank_you_anyway')) 
     elif f.is_valid(): 
      #Process here 
      return HttpResponseRedirect(reverse('thanks_for_participating')) 
    else: 
     initial = {'weekday': date.today().strftime('%A')} 
     f = OpinionForm(initial=initial) 

    return render_to_response(
     'get_opinion.html', 
     {'form': f,}, 
     RequestContext(request) 
    ) 

form_is_blank()一部です。

+0

これにはさらに別のユースケースが必要です。あなたがちょうど少なくとも1つのフィールドが満たされていることに気を付けるなら、それは何かのジャバスクリプトでクライアント側で起こるはずのように聞こえる。 –

+0

@マット:提案をありがとう。私はいくつかのコードを詳述しました。 –

答えて

22

私自身の質問に答える必要があります。

どうやら、文書化されていないForm機能があります:has_changed()

>>> f = MyForm({}) 
>>> f.has_changed() 
False 
>>> f = MyForm({}) 
>>> f.has_changed() 
False 
>>> f = MyForm({'name': 'test'}) 
>>> f.has_changed() 
True 
>>> f = MyForm({'name': 'test'}, initial={'name': 'test'}) 
>>> f.has_changed() 
False 

だから、これは(もちろん戻っ)form_is_blank()の代替としてうまく行うだろう。

+0

フォームが空白でない場合、フォームを保存する場合はどうすればよいですか? 'has_changed'メソッドはそれを助けませんでしたか? –

0

フォームフィールドまたはモデルblank=Falserequired=Trueを入力した場合、is_valid()はFalseを返します。

3

フォームのすべてのフィールドでrequired = Falseを設定し、カスタム検証を行うにはcleanメソッドをオーバーライドする必要があります。詳細については、the current documentationを参照してください。

+0

私の特定のユースケースでは、ビューに複数のフォームがあります。ユーザーがフォームの1つを入力し始めると、特定のフィールドが必要になります。 – Bobort

4

あなたも

class YourForm(forms.ModelForm): 
    def full_clean(self): 
     if not self.has_changed(): 
      self._errors = ErrorDict() 
      return 

     return super(YourForm, self).full_clean() 

を定義する必要があり、実際の<形>タグで使用されるフォームのサブセットのために、この機能の作業を取得するには、ユーザーが検証エラーを修正するように指示されたときに、それはフォームからのエラーを表示doesntのいくつかの値が空白(またはデフォルト)でない場合にのみ検証を行います。

関連する問題