Czy istnieje widget w Django 1.0.2, który renderuje models.BooleanField
jako dwa przyciski opcji zamiast pola wyboru?Django BooleanField jako przyciski radiowe?
Odpowiedz
Można to zrobić poprzez nadpisanie definicji pola w ModelForm:
class MyModelForm(forms.ModelForm):
boolfield = forms.TypedChoiceField(
coerce=lambda x: x == 'True',
choices=((False, 'False'), (True, 'True')),
widget=forms.RadioSelect
)
class Meta:
model = MyModel
Należy również pamiętać, że MySQL używa tinyint dla Boolean, więc Prawda/Fałsz są rzeczywiście 1/0. Użyłem tej funkcji przymusić:
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
Modyfikowanie odpowiedź Daniela Roseman trochę, można naprawić bool („false”) = True problemu zwięźle używając tylko ints zamiast:
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
To nie działa w moim formularzu edycji. Bieżąca wartość pola nie jest pobierana z modelu. Zamiast tego użyłem odpowiedzi eternicode. – Dave
Oto krótki & brudny funkcja wymusić za pomocą lambda, który dostaje się wokół "false" -> true problemu:
...
boolfield = forms.TypedChoiceField(coerce=lambda x: x and (x.lower() != 'false'),
...
Django 1.2 dodała "widgety" Meta opcję modelforms:
W swojej models.py, określenie "wybory" do logicznej polu:
BOOL_CHOICES = ((True, 'Yes'), (False, 'No'))
class MyModel(models.Model):
yes_or_no = models.BooleanField(choices=BOOL_CHOICES)
Następnie w forms.py określ widget RadioSelect na tym polu:
class MyModelForm(forms.ModelForm):
class Meta:
model = MyModel
widgets = {
'yes_or_no': forms.RadioSelect
}
Przetestowałem to z db SQLite, który również przechowuje wartości logiczne jako wartości 1/0, i wydaje się, że działa dobrze bez niestandardowej funkcji Coerce.
Zdecydowanie najczystszym i najbardziej "django" rozwiązaniem. Dzięki! –
To jest świetne. Zmodyfikuję go nieznacznie, aby umożliwić zlokalizowane wersje "Tak" i "Nie", używając 'from django.utils.translation importuj ugettext_lazy jako _' i aktualizując' BOOL_CHOICES' na: 'BOOL_CHOICES = ((True, _ ("Tak")), (Fałsz, _ ("Nie"))) ' – tatlar
Myślę, że dodatkowy kod do zlokalizowania go odciągnie od punktu. Ćwiczenie dla czytelnika;) – eternicode
Jak jest problem z odpowiedzią @Daniel Roseman, bool ("Fałsz") -> Prawda, więc teraz połączyłem dwie odpowiedzi tutaj, by zrobić jedno rozwiązanie.
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
Teraz to będzie działać :)
samo jak na @ eternicode odpowiedź, ale bez modyfikacji modelu:
class MyModelForm(forms.ModelForm):
yes_no = forms.RadioSelect(choices=[(True, 'Yes'), (False, 'No')])
class Meta:
model = MyModel
widgets = {'boolfield': yes_no}
myślę, że to działa tylko w Django 1.2+
An inne rozwiązanie:
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)
Oto najprostsze podejście udało mi się znaleźć (używam Django 1.5):
class MyModelForm(forms.ModelForm):
yes_no = forms.BooleanField(widget=RadioSelect(choices=[(True, 'Yes'),
(False, 'No')]))
To powinno być właściwą odpowiedzią. –
Sprawdzanie tego rozwiązania działa, ale zobacz [uwaga w dokumentach] (https://docs.djangoproject.com/en/1.10/ref/forms/fields/#booleanfield). Musisz ustawić required = False na polu. – grokpot
W Django 1.6, następujące pracował dla mnie:
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. Przyciski radiowe Yii
- 2. Przyciski radiowe + elementy tablicy
- 3. Przyciski radiowe Knockoutjs
- 4. Zamiast tego przyciski radiowe wyglądają jak przyciski.
- 5. Przyciski radiowe w bootstrapie.form-horizontal
- 6. Mieszanie przyciski radiowe i text_field
- 7. Firefox pamięta niepoprawnie przyciski radiowe
- 8. javascript wyboru przyciski radiowe automatycznie
- 9. Formularz Django z tylko BooleanField
- 10. Wielofunkcyjne przyciski radiowe w systemie Android?
- 11. przyciski radiowe znikają w IE i chrom
- 12. Dwa przyciski radiowe mają jeden "identyfikator"?
- 13. Korzystanie Twitter Bootstrap przyciski radiowe z kolbą
- 14. różnica między onClick() i onChange() (przyciski radiowe)
- 15. Wyrównaj przyciski radiowe wewnątrz grupy radiowej
- 16. Przyciski radiowe Ustaw sprawdzony stan za pomocą kodu
- 17. Przyciski radiowe i .attr ("sprawdzone", "sprawdzone") NIE działają w IE7
- 18. Jak dynamicznie dodawać przyciski radiowe zgodnie z podaną liczbą zliczeń?
- 19. Sprawdzanie i odznaczając radiowe przyciski z jQuery Mobile
- 20. Jak wyrównać przyciski radiowe w poziomie w materiale kątowym?
- 21. jQuery: zaznacz pola wyboru zachowywać się jak przyciski radiowe?
- 22. Ruby on Rails przyciski radiowe do odbioru wybrać
- 23. Przechowywanie wartości domyślnych dla BooleanField() i IntegerField() w Django REST
- 24. formularz Django z BooleanField zawsze nieważna, chyba że zaznaczone
- 25. Przyciski radia WinForms
- 26. ASP.NET MVC Tak/Nie Przyciski radiowe z mocno powiązanym modelem MVC
- 27. Java dodać przyciski dynamicznie jako tablica
- 28. Jak zmienić kursor brzydki obraz na niepełnosprawnych przyciski radiowe/pola wyboru
- 29. Angular 2: jak utworzyć przyciski radiowe z enum i dodać wiązanie dwukierunkowe?
- 30. Przyciski radiowe pokazują niechciane białe tło w Chrome. Firefox działa dobrze
Niestety to nie działa, ponieważ przymusić = bool jest przekazywany wartość łańcucha, a nie wartość boolean i bool ("False") => True. Musiałem więc napisać niestandardową funkcję coerce, aby pobrać wartość ciągu i przekonwertować na wartość bool, a następnie zadziałało. Dzięki za wskaźnik. – dar
Naprawdę powinien zostać zaktualizowany, ponieważ, jak zauważa @dar, to faktycznie NIE będzie działało od 'bool ('False')' => 'True'. –
@Daniel, to nie działa, bool ('False') zwraca True –