2012-04-05 8 views
0

In Django, ich habe Code, um ein Kontrollkästchen dynamisch zu deaktivieren, wenn das Häkchen löst einige Objekt Löschung. Wenn mein Objekt nicht gelöscht werden soll, wird das Kontrollkästchen mit deaktiviert angezeigt und nicht gesendet.Django: Ermitteln, ob das Kontrollkästchen abgeschickt oder deaktiviert ist

In der Ansicht kann ich jedoch nicht unterscheiden, ob das Kontrollkästchen als falsch übergeben wird und das Kontrollkästchen nicht gesendet wird, da form.cleaned_data immer noch den Schlüssel "is_user" enthält.

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) 

I werfen die Form von seinem Ankreuzfeld-deaktivierten Zustand, und in der PDB-Schale kann Typ I:

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

Ich hatte erwartet, dass form.cleaned_data keinen Schlüssel für das nicht übermittelte Feld enthält. Wie kann ich erkennen, ob es nicht gesendet, im Gegensatz zu abgeschickt wurde?

Antwort

3

Es gibt keinen Unterschied in HTML zwischen einem Kontrollkästchen, das nicht markiert ist und einem, das nicht gesendet wird. Einfach gesagt, wenn Sie ein Kontrollkästchen deaktivieren, ist es nicht im POST enthalten. Das hat nichts mit Django zu tun, aber so funktionieren Browser.

Wenn Sie wirklich zwischen diesen Zuständen unterscheiden müssen, benötigen Sie ein anderes Steuerelement: vielleicht eine Reihe von Optionsfeldern für is_user mit true und false Werte. Alternativ, wenn Sie unbedingt ein Kontrollkästchen haben müssen, könnten Sie vielleicht etwas Javascript verwenden, um ein verstecktes Steuerelement zu setzen, wenn es nicht markiert ist.

In jedem Fall, mit Code, der es sei denn löscht ein Kontrollkästchen aktiviert ist, ist sehr definitiv der falsche Weg, um darüber zu gehen. Aktionen sollten immer auf die am wenigsten destruktiven Werte eingestellt sein: Wenn Sie etwas wie das Löschen tun möchten, müssen Sie eine positive Aktion ausführen.

+0

Erstens haben Sie Recht mit der Absicht des Codes, und ich habe Dinge geändert, um auf den Status des booleschen Feldes des ersten Modells zu reagieren, anstatt auf das Vorhandensein des verwandten Objekts im zweiten Modell. Also danke für diesen Stupser. Sagen Sie, dass die gereinigten Daten des Formulars einen Schlüssel enthalten, aber keinen Wert für das deaktivierte Kontrollkästchen? – nimasmi

+0

Nein: Die 'cleaned_data' enthält' False' für den Schlüssel des Kontrollkästchens, egal ob es deaktiviert oder nicht aktiviert ist. –

Verwandte Themen