Python/Django Booleanfield -Modell mit Radioselect -Form standardmäßig leer
-
28-09-2019 - |
Frage
Ich verwende einen Django Modelform, in dem mein Modell ein Booleanfield enthält und das Formular -Widget, das mit diesem Booleanfield verbunden ist, ein Radioselect -Widget ist. Ich möchte, dass das Radioselect -Widget, das keine Optionen ausgewählt hat, ausgewählt werden, sodass der Benutzer explizit eine Wahl treffen muss, aber die Formularvalidierung fehlschlägt fehl, wenn er keine Auswahl trifft. Gibt es eine Möglichkeit, dies zu tun?
Models.py
myboolean = models.BooleanField(choices=YES_NO)
forms.py
class myModelForm(forms.ModelForm):
def __init__(self, *args, **kwargs):
super(myModelForm, self).__init__(*args, **kwargs)
self.fields['myboolean'].widget = forms.RadioSelect(choices=YES_NO)
Lösung
Ihr Code macht tatsächlich das, was Sie brauchen. Es rendert die Optionsfelder ohne ausgewählte Optionen und generiert die Fehlermeldung, wenn nichts ausgewählt ist.
Ein kleiner Hinweis zu Ihrem Formularcode. Ich würde es so machen:
class myModelForm(forms.ModelForm):
myboolean = forms.BooleanField(widget=forms.RadioSelect(choices=YES_NO))
class Meta:
model = MyModel
Andere Tipps
Leider ist dies weniger ein Django -Problem als eine HTML -Frage. In der HTML -Spezifikation (RFC1866) heißt es:
Zu jeder Zeit wird genau eine der Optionsfelder in einem Satz überprüft. Wenn keiner deru003CINPUT> Elemente eines Satzes von Optionsfeldern geben "Checked" an, dann muss der Benutzeragent das erste Optionsfeld des Satzes zunächst überprüfen.
Browser haben dies jedoch in der Vergangenheit ignoriert und Optionspunkte auf unterschiedliche Weise implementiert.
HTML macht dies auch schwierig, weil das "geprüfte" Attribut desu003CINPUT> Tag nimmt keinen Parameter an, sodass Sie kein angepasendes Django -Widget verwenden können, das dieses Attribut auf false oder nein festlegt
Eine mögliche Problemumgehung besteht darin, ein kleines JavaScript einzugeben, das als Teil des Onload -Ereignisses des Dokuments ausgeführt wird, bei dem alle Optionsfelder auf der Seite findet und das Attribut "Checked" auf False festgelegt wird (z. B. mit JQuery).
Ich habe ein benutzerdefiniertes Feld mit Standard -Widget erstellt.
Schnitt meiner Modelle.py:
class Order(models.Model):
...
# transport = models.CharField(choices=transport.choices,max_length=25,null=True)
transport = SelectField(choices=transport.choices,max_length=25,null=True)
...
Felddefinition:
from django.db import models
from django.forms import widgets
class SelectField(models.CharField):
def formfield(self, **kwargs):
if self._choices:
defaults = {'widget': widgets.RadioSelect}
defaults.update(kwargs)
return super(SelectField, self).formfield(**defaults)