我有一个简单的应用程序,用户应该在比赛结果上下注。比赛由两个队组成,一个结果和一个赌注。与团队的匹配在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实例传递给模板并且只运行内部循环,那么它可以工作。
非常感谢您的建议。
答案 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 %}
应该做的伎俩!
否则,您可以将表单放在一个列表中,如果您的主要目标是保留其订单并使模板代码保持原样,那么这将更有意义!