Как отобразить метку параметров в ModelMultipleChoiceField? - PullRequest
1 голос
/ 02 сентября 2011

У меня есть это:

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

Есть ли способ, которым я могу создать свой собственный список флажков?Вместо значения по умолчанию в неупорядоченном списке?

Вот что я надеюсь достичь:

<select>
{% for a in house_form.amenities %}
  <option value="{{ a.value }}" {% if a.checked %}selected="selected"{% endif %}> 
  {{ a.option_name }}</option>
{% endfor %}
</select>

Я надеюсь, что смогу настроить список, разбить его на 3 столбца и т. Д. Есть предложения?

Я знаю, что могу передать список всех удобств и список удобств в доме и сделать цикл for, чтобы сравнить его.Я просто нахожу это не элегантным и неэффективным.

1 Ответ

0 голосов
/ 04 сентября 2011

подкласс form.CheckboxSelectMultiple (метод render ()?), Чтобы получить требуемый вывод.

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
    )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...