2011-09-02 4 views
14

W dokumentach, nullbooleanfield jest reprezentowany as a <select> box with "Unknown", "Yes" and "No" choices. Jak mogę zmienić wartości select na inne bardziej znaczące teksty i odwzorować je z powrotem na tak, nie i nieznane wartości w moim modelform?django: jak zmienić wartości dla nullbooleanfield w modelformie?

Na przykład mam yes_no_required = models.NullBooleanField() i chciałbym mieć 'yes I acknowledge this', 'no, I do not like this' i 'I do not know now' mapowanie na yes, no i wymaga odpowiednio.

Odpowiedz

29

spędziłem pół godziny łącząc demo żeby udowodnić sobie, to działa:

CHOICES = (
    (None, "I do not know now"), 
    (True, "Yes I acknowledge this"), 
    (False, "No, I do not like this") 
) 

class Demo(models.Model): 
    yes_no_required = models.NullBooleanField(choices = CHOICES) 

class DemoForm(forms.ModelForm): 
    class Meta: 
     model = Demo 

Spojrzałem w kodzie źródłowym Django. Wszystko może akceptować tablicę wyborów. Oczywiście dla niektórych z tych, które nie mają sensu, ale jest to możliwe.

+3

Wygląda na to, że Django dodaje kolejny wybór dla Null do FormFi eld choice, ponieważ null-attr jest ustawione na true. Będziesz musiał również przekazać wybrane opcje do FormField, aby faktycznie ograniczyć to do tych wyborów, a nie do dodatkowych przerywanych opcji zerowych. – codingjoe

+0

To już nie działa. 'TypeError: __init __() dostał nieoczekiwany argument słowa kluczowego 'choices'' –

3

Można sobie z tym poradzić w formie (withouth modyfikacji modeli) tak:

forms.NullBooleanField(
    widget=forms.RadioSelect(renderer=HorizontalRadioRendererSpace, 
     choices=CHOICES), 
    label='...', 
    required=False) 

myślę, że jest to zły pomysł, aby użyć NullBooleanField dla danych, które mogą być w trzech stanach, takich jak: tak/nie /nieoprawny.

Edycja danych działa. Ale duży problem powstaje, jeśli chcesz napisać formularz wyszukiwania dla tych danych.

następnie „pusty” wartości może mieć dwa znaczenia:

  • nie obchodzi tego atrybutu. Uwzględnij wszystkie wiersze
  • Uwzględnij tylko te wiersze, w których kolumna ma wartość NULL.

Rozwiązanie jest proste: użyj opcji ChoiceField.

Więcej szczegółów tutaj: https://github.com/guettli/programming-guidelines/blob/master/README.rst

2

Można modyfikować widget pola w ModelForm meta Klasa:

CHOICES = (
      (None, "I do not know now"), 
      (True, "Yes I acknowledge this"), 
      (False, "No, I do not like this"), 
      ) 
class DemoForm(forms.ModelForm): 
    class Meta: 
     model = Demo 
     fields = ("demo_field",) 
     widgets = { 
       'demo_field': forms.RadioSelect(choices = CHOICES), 
        } 
1

Proste podejście byłoby zmienić widgetów wyborów w postaci:

class YourForm(forms.ModelForm): 

    def __init__(self, *args, **kwargs): 
     super(YourForm, self).__init__(*args, **kwargs) 
     new_choices = ((1, 'I do not know now'), 
         (2, 'Yes I acknowledge this'), 
         (3, 'No, I do not like this')) 
     self.fields['your_field'].widget.choices = new_choices 
Powiązane problemy