Gibt es ein Widget in Django 1.0.2, um eine models.BooleanField
als zwei Radiobuttons anstelle einer Checkbox zu rendern?Django BooleanField als Optionsfelder?
Antwort
Sie können dies tun, indem Sie die Felddefinition in der Modelform überschreiben:
class MyModelForm(forms.ModelForm):
boolfield = forms.TypedChoiceField(
coerce=lambda x: x == 'True',
choices=((False, 'False'), (True, 'True')),
widget=forms.RadioSelect
)
class Meta:
model = MyModel
Denken Sie auch daran, dass MySQL Tinyint für Boolean, so Wahr/Falsch sind eigentlich 1/0 verwendet. Ich habe diese coerce Funktion:
def boolean_coerce(value):
# value is received as a unicode string
if str(value).lower() in ('1', 'true'):
return True
elif str(value).lower() in ('0', 'false'):
return False
return None
Ändern Daniel Roseman Antwort ein wenig, man konnte die Bool beheben ("False") kurz und bündig wahre Problem = von nur statt Ints mit:
class MyModelForm(forms.ModelForm):
boolfield = forms.TypedChoiceField(coerce=lambda x: bool(int(x)),
choices=((0, 'False'), (1, 'True')),
widget=forms.RadioSelect
)
class Meta:
model = MyModel
Dies funktioniert nicht auf meinem Bearbeitungsformular. Der aktuelle Wert des Felds wird nicht aus dem Modell abgerufen. Ich habe stattdessen eternicodes Antwort verwendet. – Dave
Hier ist eine schnelle & schmutzig coerce Funktion Lambda verwenden, die um den "false" wird -> True Problem:
...
boolfield = forms.TypedChoiceField(coerce=lambda x: x and (x.lower() != 'false'),
...
Django 1.2 hat die "Widgets" Meta-Option für modelforms hinzugefügt:
In Ihrem models.py, die "Auswahl" für Ihre boolean Feld angeben:
BOOL_CHOICES = ((True, 'Yes'), (False, 'No'))
class MyModel(models.Model):
yes_or_no = models.BooleanField(choices=BOOL_CHOICES)
in Ihrem forms.py Dann, für das Feld der RadioSelect Widget angeben:
class MyModelForm(forms.ModelForm):
class Meta:
model = MyModel
widgets = {
'yes_or_no': forms.RadioSelect
}
Ich habe dies mit einer SQLite-Datenbank getestet, die auch boolesche Werte als 1/0-Werte speichert, und es scheint ohne eine benutzerdefinierte Zwangsfunktion zu funktionieren.
Die sauberste und "Django" Lösung mit Abstand. Vielen Dank! –
Das ist großartig. Ich würde es leicht modifizieren, um lokalisierte Versionen von 'Ja' und 'Nein' zu erlauben, indem 'von django.utils.translation import ugettext_lazy als _' verwendet und 'BOOL_CHOICES' aktualisiert wird: ' BOOL_CHOICES = ((True, _ ("Ja")), (Falsch, _ ('Nein'))) ' – tatlar
Ich denke, der zusätzliche Code zur Lokalisierung würde von dem Punkt ablenken. Eine Übung für den Leser;) – eternicode
Da gibt es ein Problem in @Daniel Roseman Antwort, Bool ('False') -> True, so jetzt habe ich zwei Antworten hier kombiniert, um eine Lösung zu machen.
def boolean_coerce(value):
# value is received as a unicode string
if str(value).lower() in ('1', 'true'):
return True
elif str(value).lower() in ('0', 'false'):
return False
return None
class MyModelForm(forms.ModelForm):
boolfield = forms.TypedChoiceField(coerce= boolean_coerce,
choices=((False, 'False'), (True, 'True')),
widget=forms.RadioSelect
)
class Meta:
model = MyModel
Jetzt wird diese Arbeit :)
Gleiche wie @ eternicode Antwort, aber ohne das Modell zu ändern:
class MyModelForm(forms.ModelForm):
yes_no = forms.RadioSelect(choices=[(True, 'Yes'), (False, 'No')])
class Meta:
model = MyModel
widgets = {'boolfield': yes_no}
Ich denke, das funktioniert nur in Django 1.2+
Ein andere Lösung:
from django import forms
from django.utils.translation import ugettext_lazy as _
def RadioBoolean(*args, **kwargs):
kwargs.update({
'widget': forms.RadioSelect,
'choices': [
('1', _('yes')),
('0', _('no')),
],
'coerce': lambda x: bool(int(x)) if x.isdigit() else False,
})
return forms.TypedChoiceField(*args, **kwargs)
Hier ist der einfachste Ansatz, den ich finden konnte (Ich verwende Django 1.5):
class MyModelForm(forms.ModelForm):
yes_no = forms.BooleanField(widget=RadioSelect(choices=[(True, 'Yes'),
(False, 'No')]))
Dies sollte die richtige Antwort sein. –
Die Überprüfung dieser Lösung funktioniert, aber siehe [Hinweis in den Dokumenten] (https://docs.djangoproject.com/en/1.10/ref/forms/fields/#booleanfield). Sie müssen erforderlich = False für das Feld festlegen. – grokpot
In Django 1.6, die für mich gearbeitet folgende:
class EmailSettingsForm(ModelForm):
class Meta:
model = EmailSetting
fields = ['setting']
widgets = {'setting': RadioSelect(choices=[
(True, 'Keep updated with emails.'),
(False, 'No, don\'t email me.')
])}
- 1. kann nicht aktualisiert Django 1.9 BooleanField
- 2. Django BooleanField nicht Wert auf Post Rückkehr, wenn Standard-
- 3. Make BooleanField ein größeres Kontrollkästchen in Django anzeigen
- 4. Registrierungsformular - Präfix als Optionsfelder in Magento
- 5. WTForms BooleanField behandelt JSON false value als true
- 6. Umschaltbare Optionsfelder
- 7. Optionsfelder in ASP.NET
- 8. Wordpress zusätzliche Felder Optionsfelder
- 9. Checkbox aktiviert bestimmte Optionsfelder
- 10. Mehrere formatierte Optionsfelder anhängen
- 11. C# WinForms Optionsfelder
- 12. Optionsfelder mit mehreren Arrays
- 13. Optionsfelder + Array-Elemente
- 14. Mehrere Zeilen Optionsfelder in Android?
- 15. Optionsfelder aktualisieren die Werte nicht
- 16. Löschen Optionsfelder eines übermittelten Formulars
- 17. simple_form rendert die Optionsfelder falsch
- 18. Django: Formset als Formularfeld
- 19. Django Signale als IPC
- 20. Ich kann Flask-WTF TextField und BooleanField nicht importieren
- 21. Was den Punkt ‚default = True‘ in BooleanField ist
- 22. Überprüfen Sie, dass ein WTForms BooleanField aktiviert ist
- 23. Optionsfelder reagieren nicht in JSP/Java
- 24. Wie können Bootstrap-Optionsfelder verwendet werden?
- 25. jQuery Optionsfelder, Labels, Ändern und Klicken Ereignisse
- 26. Füllen Sie überprüfte Optionsfelder aus der Datenbank
- 27. jQuery: Aktivieren Sie Checkboxen wie Optionsfelder?
- 28. Wie gruppiere ich Windows Form-Optionsfelder?
- 29. Java, mit einem ActionListener für mehrere Optionsfelder
- 30. jQuery - Kontrollkästchen deaktivieren, die wie Optionsfelder funktionieren
Leider hat dies nicht funktioniert, weil die coerce = bool wird ein Zeichenfolgenwert und nicht der boolesche Wert und bool ("False") => True übergeben. Also musste ich eine benutzerdefinierte Coerce-Funktion schreiben, um den String-Wert zu übernehmen und nach bool zu konvertieren, dann funktionierte es. Danke für den Zeiger. – dar
Sollte wirklich aktualisiert werden, da @dar feststellt, dass dies eigentlich NICHT funktioniert seit 'bool ('False')' => 'True'. –
@Daniel, es funktioniert nicht, bool ('False') gibt True zurück –