2011-09-02 5 views
14

nullbooleanfieldas a <select> box with "Unknown", "Yes" and "No" choices.으로 표시됩니다. select의 값을 다른 의미있는 텍스트로 변경하고 modelform의 예, 아니요 및 알 수없는 값으로 다시 매핑하는 방법은 무엇입니까? 예를 들어django : modelform에서 nullbooleanfield 값을 변경하는 방법?

나는 yes_no_required = models.NullBooleanField()을하고 난 예, 아니오 따라 필요에 'yes I acknowledge this', 'no, I do not like this''I do not know now' 매핑을하고 싶습니다. 내가 함께 데모를 넣어 반 시간을 보냈다

답변

29

그냥이 작동 자신에게 증명하기 : 내가 장고 소스 코드에서 보았다

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 

. 모두은 선택 배열을 허용 할 수 있습니다. 분명히 이해가되지 않는 사람들을 위해, 그러나 그것은 가능합니다.

+3

Django와 같은데, Null을 FormFi에 추가 할 수 있습니다. null-attr이 true로 설정되어 있기 때문에 선택 항목을 선택할 수 있습니다. 실제로 FormField에 선택 사항을 전달해야합니다.이 옵션을 실제로 선택 사항으로 제한하고 추가로 대시 null 선택 항목을 제한하지 않아야합니다. – codingjoe

+0

더 이상 작동하지 않습니다. 'TypeError : __init __()에 예상치 못한 키워드 인수 'choices'가 있습니다. –

3

이 (같은 모델을 수정 withouth) 형태로이 문제를 처리 할 수 ​​

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

을 내가 같은 세 가지 상태에있을 수있는 데이터에 대한 NullBooleanField를 사용하는 것은 좋은 아이디어라고 생각 : 예 아니오// unset.

데이터 편집이 작동합니다. 그러나이 데이터에 대한 검색 양식을 작성하려는 경우 큰 문제가 발생합니다.

  • 이 속성에 대해 걱정하지 마십시오

    그런 다음 "빈"값은 두 가지 의미를 가질 수 있습니다. 모든 행 포함
  • 열이 NULL 인 행만 포함합니다.

해결 방법은 간단합니다. ChoiceField를 사용하십시오. 여기

자세한 내용 : https://github.com/guettli/programming-guidelines/blob/master/README.rst

2

당신은 당신의 ModelForm에 메타 클래스를 당신의 분야 위젯을 수정할 수 있습니다

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

간단한 방법은 양식에 위젯 선택을 변경하는 것입니다 :

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 
관련 문제