2011-09-02 2 views
1

나는이 있습니다ModelMultipleChoiceField에서 옵션의 레이블을 표시하는 방법은 무엇입니까?

class HouseForm(forms.ModelForm): 
    amenities = ModelMultipleChoiceField(
     queryset=Amenity.objects.all(), 
     widget=forms.CheckboxSelectMultiple(), 
     required=False 
    ) 

내가 체크 박스 내 자신의 목록을 만들 수있는 방법이 있나요? 정렬되지 않은 목록의 기본값 대신에?

내가 3 열 침입, 목록을 사용자 정의 할 수 있도록 노력하겠습니다
<select> 
{% for a in house_form.amenities %} 
    <option value="{{ a.value }}" {% if a.checked %}selected="selected"{% endif %}> 
    {{ a.option_name }}</option> 
{% endfor %} 
</select> 

등 어떤 제안 : 여기

내가 달성하기 위해 희망 무엇인가?

나는 모든 편의 시설 목록과 편의 시설 목록을 통과 할 수 있으며이를 비교하기위한 for 루프를 수행 할 수 있음을 알고 있습니다. 나는 그것을 우아하고 비능률적이라고 생각합니다.

답변

0

하위 클래스 forms.CheckboxSelectMultiple (render() method?) 필요한 출력을 제공합니다.

class TabularSelectMultiple(SelectMultiple): 
    def render(self, name, value, attrs=None, choices=()): 
     if value is None: value = [] 
     has_id = attrs and 'id' in attrs 
     final_attrs = self.build_attrs(attrs, name=name) 
     output = [u'<table>','<tr><th></th><th>Label</th></tr>'] 
     # Normalize to strings 
     str_values = set([force_unicode(v) for v in value]) 
     for i, (option_value, option_label) in enumerate(chain(self.choices, choices)): 
      if has_id: 
       final_attrs = dict(final_attrs, id='%s_%s' % (attrs['id'], i)) 
       label_for = u' for="%s"' % final_attrs['id'] 
      else: 
       label_for = u''    
      cb = CheckboxInput(final_attrs, check_test=lambda value: value in str_values).render(name, option_value) 
      option_value = force_unicode(option_value) 
      option_label = conditional_escape(force_unicode(option_label)) 
      output.append(u'<tr><td>%s</td><td><label%s> %s</label></td></tr>' % (cb, label_for, option_label)) 
     output.append(u'</table>') 
     return mark_safe(u'\n'.join(output)) 

class HouseForm(forms.ModelForm): 
    amenities = ModelMultipleChoiceField(
     queryset=Amenity.objects.all(), 
     widget=TabularSelectMultiple(), 
     required=False 
    ) 
관련 문제