2

ModelForms を生成していますが、テンプレートでの出力方法をきめ細かく制御したいと考えています。具体的には、各選択リストの各ラジオ ボタンの最後にマークアップを追加する必要があります。

コード:

# order-form.html

{% load catname %}
<form id = "order-form">
{% for form in forms %}
<div id="gun-{{ forloop.counter }}">
    {% for field in form.fields %}
        <div id="{{ field }}-item" class="item">
            <h3>{{ field|catname }}</h3>
            {% for choice in form.field.choices %} {# <-- Help me out here #}
                {{ choice.id }}
                {{ choice.title }}
            {% endfor %}
        </div>
    {% endfor %}
{% endfor %}
<button type="submit" id="standard-gun-form-submit">Continue to next step</button>
</form>

# views.py
def get_form(request):
    if request.method == 'POST':
        if request.POST['gun_type'] == 'standard':
            forms = [StandardGunForm(prefix=p) for p in range(0,2)]
            return render_to_response('main/order-form.html', {'forms' : forms,}, RequestContext(request))

# forms.py

class StandardGunForm(ModelForm):
    def __init__(self, *args, **kwargs):
        super(StandardGunForm, self).__init__(*args, **kwargs)  
        for field in self.fields: 
            if isinstance(self.fields[field], ModelChoiceField):
                self.fields[field].empty_label = None

    class Meta:
        model = BaseGun
        widgets = {
            'FrameTuning' : RadioSelect(),
            'FrameConnection' : RadioSelect(),
        }
        exclude = ('price')

Endgame: このようなマークアップ

<form id="foo">
<div class="category">
    <div class="item">
        <input type="radio" name="srsbzns" value="1">Option 1</input>
        <img src="http://placekitten.com/150/150">
        <p>Other foo here</p>
    </div>
    <div class="item">
        <input type="radio" name="srsbzns" value="2">Option 2</input>
        <img src="http://placekitten.com/150/150">
        <p>Other foo here</p>
    </div>
    <div class="item">
        <input type="radio" name="srsbzns" value="3">Option 3</input>
        <img src="http://placekitten.com/150/150">
        <p>Other foo here</p>
    </div>  
</div>
</form>

シェルから、これは私が望むものを返します

>>> forms = [StandardGunForm(prefix=p) for p in range(0,2)]\
>>> forms[0].fields['frame_tuning'].choices.queryset

これがとても難しいことが証明されていることに驚いています!

おまけ: DEBUG = True と Django Debug ツールバーが有効になっています。変数をブラウザーにダンプすることは可能ですか?

ありがとう!

4

4 に答える 4

4

私も同様のことをしなければならず、この道を歩み始めました。各列がモデル インスタンスの異なるフィールドを持つ ModelChoiceField からテーブル行を作成したかった (そして、JavaScript を介してテーブル行をフィルタリングできるようにする)。

Django のドキュメントでは見つけられませんでしたが、Django のソースをざっと読んだところ、その方法がわかりました。次のように、クエリセットにアクセスしてモデル インスタンスにアクセスできます。

<form action="{% url 'some_view' %}" method="post">
    {% csrf_token %}
    {% if form.non_field_errors %}
        {{ form.non_field_errors }}
    {% endif %}

    {% for field in form %}
        {{ field.label }}

        {% if field.field.choices %}
          {% for model_instance in field.field.choices.queryset %}
            {{ model_instance.id }}
          {% endfor %}
        {% else %}
          {{ field }}
        {% endif %}

        {% if field.errors %}
            {{ field.errors|striptags }}
        {% endif %}

    {% endfor %}

    <button type="submit">Submit</button>
</form>

ただし、この時点で光沢のあるウィジェット (私の場合は CheckboxSelectMultiple) を逆アセンブルしたので、テンプレート コードを使用して HTML フォーム入力を再アセンブルする必要があります。ModelChoiceField を同時に反復処理してモデル インスタンス フィールドにアクセスし、選択肢の HTML フォーム タグを取得する直接的な方法は見つかりませんでした。

方法はあるかもしれませんが、私はその試みを断念し、ビュー内のすべての POST データを処理する独自の HTML フォームを作成しました。その方法ではるかに簡単に終わりました。ModelForms は非常に便利で便利ですが、作成されていない目的で使用すると、最終的にはより困難になる可能性があります。

誰かが他の理由でそれをやろうとしている場合に備えて、これを投稿すると思いました. それが役に立てば幸い。

于 2013-07-11T21:27:19.760 に答える
0
{% for choice in form.field.choices %} {# <-- Help me out here #}
            {{ choice.id }}
            {{ choice.title }}
{% endfor %}

ここで何をしているのか見てください。このループでは、文字通り「フィールド」と呼ばれるフィールドにアクセスしようとしていますが、これはおそらく存在しません。

繰り返し処理しているフィールドオブジェクトを取得し、そのオブジェクトのchoices属性にアクセスする必要があります。

{% for field in form.fields %}
   {% for choice in field.choices %}
于 2013-01-13T22:45:59.797 に答える