2011-04-28 3 views
10

Django 1.3에서 ModelForm을 사용하고 있습니다.Django의 RadioSelect에 의해 생성 된 가짜 선택 항목을 없애는 방법

models.py :

class UserProfile(models.Model): 
... 
gender = models.CharField(max_length=1, blank=True, choices=(('M', 'Male'), ('F', 'Female'), ('Unspecified', '')), default='M') 
... 

forms.py :이 위젯은 HTML로 렌더링 될 때

class UserProfileForm(ModelForm): 
    class Meta: 
     model = UserProfile 
     fields = ('gender') 
     widgets = { 
      'gender': forms.RadioSelect(), 
     } 

, 내가 가지고

<ul> 
<li><label for="id_gender_0"><input type="radio" id="id_gender_0" value="" name="gender" />---------</label></li> 
<li><label for="id_gender_1"><input checked="checked" type="radio" id="id_gender_1" value="M" name="gender" /> Male</label></li> 
<li><label for="id_gender_2"><input type="radio" id="id_gender_2" value="F" name="gender" />Female</label></li> 
<li><label for="id_gender_3"><input type="radio" id="id_gender_3" value="" name="gender" /> Unspecified</label></li> 
</ul> 

문제 : 어떻게 나는 가짜 선택 "--------"을 제거합니까?

사용자가 몇 달 전에 또 다른 stackoverflow에 의해 같은 문제가 발생했습니다 (Here). 나는 거기에 (당신이 볼 수 있듯이) 받아 들여진 해결책을 시도했지만 저를 위해 작동하지 않았습니다.

답변

9

blank = True가 아닌 경우에도 추가 입력이 표시됩니다.

from itertools import chain 
from django.forms import RadioSelect 
from django.utils.encoding import force_unicode 

class RadioSelectNotNull(RadioSelect): 
    def get_renderer(self, name, value, attrs=None, choices=()): 
     """Returns an instance of the renderer.""" 
     if value is None: value = '' 
     str_value = force_unicode(value) # Normalize to string. 
     final_attrs = self.build_attrs(attrs) 
     choices = list(chain(self.choices, choices)) 
     if choices[0][0] == '': 
      choices.pop(0) 
     return self.renderer(name, str_value, final_attrs, choices) 
+2

NickJ의 대답은 정확하지만 한 가지를 추가하고 싶습니다. 내가 잘못 본게 아니라면, 다음 라인에서 choice = list (chain (self.choices, choices)) chain은 여분의 import가 필요하다 : from itertools import chain –

1

위젯을 설정할 때 선택 사항을 설정할 수 있습니다. 그것은 여러분의 모델에 blank = True를 가지고 있기 때문에 ----을 보여줍니다.

위젯의 선택 인수를 사용하여 모델에서 설정 한 선택 항목으로 설정하면됩니다.

+0

이 경우에도 '빈 = FALSE'모델에 나에게 발생합니다. –

5

설정 blank=False (또는 제거)도 기본적으로 목록의 맨 위에 빈 선택할 수 있습니다 ModelChoiceField에서 사용하는 위젯을 default='Unspecified'

+0

Django 1.4.5에서는 이것이 효과가있다. – mkoistinen

1

를 추가 : 나는 새로운 위젯을 만들었습니다.

empty_label 속성을 사용하여이 라벨의 텍스트 (기본적으로 "---------")를 변경하거나 empty_label을 None으로 설정하여 빈 라벨을 완전히 비활성화 할 수 있습니다.

사용자 지정 빈 레이블 :

field1 = forms.ModelChoiceField(queryset=..., empty_label="(Nothing)") 

빈 레이블 :

field2 = forms.ModelChoiceField(queryset=..., empty_label=None) 
관련 문제