1

私はフォームを持っています:

class AccessoriesForm(forms.Form):

    available_accessories = Parts.objects.all()

    accessory = forms.ModelMultipleChoiceField(
        queryset=available_accessories,
        widget=forms.CheckboxSelectMultiple(
            attrs={'class': 'accessory-checkbox'}
        ),
        label=None
    )

そして私のテンプレートでは:

{% for field in accessory_form %}
    {{ field }}
{% endfor %}

これにより、チェックボックスのリストが表示されます。ただし、個々のチェックボックスをターゲットにして、それぞれの横に一意の画像を追加できるようにしたいと考えています。各フィールドの名前を取得できれば、それでうまくいくでしょう。

私が試してみました:

{% for field in accessory_form %}
    {{ field }}{{ field.name }}
{% endfor %}

と:

{% for field in accessory_form %}
    {{ field }}{{ field.label }}
{% endfor %}

しかし、それは私にフィールドのラベルを与えるだけです。

4

2 に答える 2

2

これを行うには、ウィジェットの独自のサブクラスを作成しCheckboxSelectMultiple、そのrenderメソッドをオーバーライドすることをお勧めします。レンダリング コードは非常に単純ですが、そのウィジェットは<ul>チェックボックスが事前にレンダリングされた要素全体を返します。

このようなもの:

class ImageCheckboxSelectMultiple(CheckboxSelectMultiple):

    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'<ul>']
        # 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 an ID attribute was given, add a numeric index as a suffix,
            # so that the checkboxes don't all have the same ID attribute.
            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 = ''

            cb = CheckboxInput(final_attrs, check_test=lambda value: value in str_values)
            option_value = force_unicode(option_value)
            rendered_cb = cb.render(name, option_value)
            option_label = conditional_escape(force_unicode(option_label))
            # Here's the new part
            image_element = u'<img src="/images/some_image.png">'
            output.append(u'<li>%s<label%s>%s %s</label></li>' % (image_element, label_for, rendered_cb, option_label))
        output.append(u'</ul>')
        return mark_safe(u'\n'.join(output))

STATIC_URL設定によっては、イメージ パスの一部として使用したい場合があります。

于 2013-06-25T22:05:05.217 に答える