渲染多个Form实例

时间:2010-06-01 20:06:41

标签: django forms django-forms

我有一个简单的应用程序,用户应该在比赛结果上下注。比赛由两个队组成,一个结果和一个赌注。与团队的匹配在Django管理员中创建,参与者将填写结果和赌注。

必须根据数据库中的匹配动态生成表单。

我的想法是为每个匹配设置一个(Django)Form实例,并将这些实例传递给模板。

当我从django shell执行它时,它工作正常,但是当我加载视图时,实例不会呈现。

表格如下:

class SuggestionForm(forms.Form):
    def __init__(self, *args, **kwargs):
        try:
            match = kwargs.pop('match')
        except KeyError:
            pass
        super(SuggestionForm, self).__init__(*args, **kwargs)
        label = match
        self.fields['result'] = forms.ChoiceField(label=label, required=True, choices=CHOICES, widget=forms.RadioSelect())
        self.fields['stake'] = forms.IntegerField(label='', required=True, max_value=50, min_value=10, initial=10)

我的(初步)视图如下所示:

def suggestion_form(request):
    matches = Match.objects.all()
    form_collection = {}

    for match in matches:
        f = SuggestionForm(request.POST or None, match=match)
        form_collection['match_%s' % match.id] = f

    return render_to_response('app/suggestion_form.html', {
        'forms': form_collection,
        },
        context_instance = RequestContext(request)
        )

我最初的想法是,我可以将form_collection传递给模板,并将循环传递给像这样的集合,但是id不起作用:

        {% for form in forms %}
            {% for field in form %}
                {{ field }}
            {% endfor %}
        {% endfor %}

(输出实际上是dict键,每个字母之间添加了空格 - 我不知道为什么......)

如果我只将一个Form实例传递给模板并且只运行内部循环,那么它可以工作。

非常感谢您的建议。

2 个答案:

答案 0 :(得分:5)

再一次,在网页上拥有多个表单的最佳方法是使用formsets

答案 1 :(得分:1)

要迭代django模板中的字典,您必须使用:

{% for key,value in dictionary.items %}{{ value }}{% endfor %}

因此

 {% for key, value in forms.items %}
    {% for field in value %}
        {{ field }}
    {% endfor %}
 {% endfor %}

应该做的伎俩!

否则,您可以将表单放在一个列表中,如果您的主要目标是保留其订单并使模板代码保持原样,那么这将更有意义!