14

RadioSelect ウィジェットを使用して ModelChoiceField を含む ModelForm があります。

class MyAForm(forms.ModelForm):
    one_property = models.ModelChoiceField(
        widget=forms.RadioSelect,
        queryset=MyBModel.objects.filter(visible=True),
        empty_label=None)
    class Meta:
        model = MyAModel

ラジオ ボタンの横に表示したい MyBModel の属性があります。ModelChoiceField のサブクラスをオーバーライドlabel_from_instanceしますが、各選択項目の行を持つテーブル内にラジオ ボタンを表示したいので、これではやりたいことができません。

だから、私のテンプレートのどこかで、次のようなものが欲しい...

{% for field in form.visible_fields %}
    {% if field.name == "one_property" %}
    <table>
        {% for choice in field.choices %}
            <tr>
                <td><input value="{{choice.id}}" type="radio" name="one_property" />{{choice.description}}</td>
                <td><img src="{{choice.img_url}}" /></td>
            </tr>
        {% endfor %}
    </table>
    {% endif %}
{% endfor %}

残念ながら、field.choices はクエリセットからのインスタンスではなく、オブジェクトの ID とラベルのタプルを返します。

テンプレート内で使用する ModelChoiceField の選択肢のインスタンスを取得する簡単な方法はありますか?

4

3 に答える 3

12

ModelChoiceField の django ソースを掘り下げた後、プロパティ「queryset」があることを発見しました。

のようなものを使用できました...

{% for field in form.visible_fields %}
    {% if field.name == "one_property" %}
    <table>
        {% for choice in field.queryset %}
            <tr>
                <td><input value="{{choice.id}}" type="radio" name="one_property" />{{choice.description}}</td>
                <td><img src="{{choice.img_url}}" /></td>
            </tr>
        {% endfor %}
    </table>
    {% endif %}
{% endfor %}
于 2012-04-24T15:36:26.983 に答える
2

通常、実際のオブジェクトは必要ありませんが、そのレンディションは必要です。

次のコードを検討してください。

class LabelledHiddenWidget(forms.HiddenInput):

    def __init__(self, get_object, *args, **kwargs):
        super(LabelledHiddenWidget, self).__init__(*args, **kwargs)
        self.get_object = get_object

    def render(self, name, value, attrs=None):
        s = super(LabelledHiddenWidget, self).render(name, value, attrs)
        if value:
            s += SafeUnicode("<span>%s</span>" % self.get_object(value))
        return s

次に、次のように使用できます。

class SomeForm(forms.Form):
    object = forms.ModelChoiceField(
         SomeModel.objects.all(), 
         widget=LabelledHiddenWidget(get_object=lambda id: get_object_or_404(SomeModel, id=id)))

次に、テンプレート コードで{{ form.object }}、オブジェクト ID を含む隠しフィールドを出力し、いくつかのラベルと連結します。もちろん、あなたの SomeModel は__unicode__、人間が読める素敵なラベルを返すメソッドを実装する必要があります。

于 2013-04-30T14:14:03.113 に答える