2012-04-05 32 views
0

djangoではチェックボックスを無効にするコードがあります。オブジェクトを削除しないと、チェックボックスが無効になり、送信されません。Django:チェックボックスがサブミットされているかどうかを検出します

しかし、ビューでは、form.cleaned_dataにはまだキー "is_user"が含まれているため、チェックボックスはfalseとして送信され、チェックボックスは送信されません。

forms.py

if somecondition: 
    self.fields["is_user"].widget.attrs['disabled'] = True 

views.py

if "is_user" in form.cleaned_data: 
    if form.cleaned_data["is_user"] == False: 
     do dangerous deleting 
     return redirect(page) 
    elif form.cleaned_data["is_user"] == True: 
     process information 
     return redirect(page) 
else: 
    return redirect(page) 

私はそのチェックボックス不可状態からフォームを送信し、PDBシェルで私が入力できます。

(pdb) form.cleaned_data 
{'is_user': False} 

form.cleaned_dataには、送信されていないフィールドのキーが含まれていないと予想していました。チェックされていないまま送信されたのではなく、送信されていないかどうかをどのように検出できますか?

答えて

3

未チェックのチェックボックスとサブミットされていないチェックボックスの間にHTMLの違いはありません。簡単に言えば、チェックボックスをオフにすると、POSTには含まれません。これはDjangoとは関係ありませんが、ブラウザの仕組みです。

本当にこれらの状態を区別する必要がある場合は、is_userのラジオボタンのセットがtruefalseの値に設定されている必要があります。あるいは、チェックボックスを絶対に持っていなければならない場合は、チェックをはずしたときに隠れたコントロールを設定するためにJavascriptを使うこともできます。

いずれにしても、を削除するコードを持つと、のチェックボックスがオンになっていないと間違いなく間違った方法です。アクションは常に最小限の破壊的なものにする必要があります。削除のようなことをするには積極的なアクションが必要です。

+0

第1に、コードの意図について正しいですし、第2モデルの関連オブジェクトの存在ではなく、最初のモデルのブール値フィールドの状態に対応するように変更しました。そのような軽快さに感謝します。送信されたデータの問題では、フォームのcleaned_dataにはキーは含まれていますが、無効なチェックボックスの値は含まれていないと言っていますか? – nimasmi

+0

いいえ: 'cleaned_data'は、チェックボックスのキーに' False'を含みます。 –

関連する問題