Django Forms:如何迭代Django形式的字段选择

时间:2011-11-02 09:30:28

标签: django django-forms django-templates

我不知道我是否以正确的方式这样做。

我有一张表格:

class ConnectSelectMultipleForm(forms.Form):
    class Meta:
        model = Connect

    def __init__(self, *args, **kwargs):
        messages = kwargs.pop('messages')
        choices = []
        if messages:
            pass
        else:
            messages = []

        for message in messages:
            index = (message.id, {message.sender, message, message.id})
            choices.append(index)

        super(ConnectSelectMultipleForm, self).__init__(*args, **kwargs)
        self.fields['message'] = forms.MultipleChoiceField(choices=choices,
                                     widget=forms.CheckboxSelectMultiple)

从上面可以看出,我正在向模板发送{message.sender, message ,message.id}。现在我想在模板中访问这些变量。

{% for field in select_form %}       
    {% for fi in field %}
        {{ fi.message }}
        {{ fi.message.sender }}
        {{ fi.message.id }}
    {% endfor %}
{% endfor %}

上面的代码错了。但我们能做类似的事吗?或者有其他方法可以做我想做的事情吗?

提前致谢。

###编辑

我通过打印字段得到的输出如下

 set([5, u'Everycrave', <Connect: The deal you refered has been bought>])

我想要的是

Id:5,姓名:Everycrave,内容:您提到的交易已被购买

所以我个别想要那些字段

1 个答案:

答案 0 :(得分:4)

你根本不想“在场上迭代”。 Django为你做这件事。你唯一的问题是如何为字段的选择创建显示值 - 出于某种原因,当你只想要一个字符串时,你将它们创建为集合。您的__init__方法应该是这样的:

def __init__(self, *args, **kwargs):
    messages = kwargs.pop('messages', None)
    super(ConnectSelectMultipleForm, self).__init__(*args, **kwargs)
    if messages is None:
        messages = []

    choices = [(message.id, "%s: %s (%s)" % message.sender, message.text, message.id)
               for message in messages]

    self.fields['message'].choices = choices

现在您只需以正常方式引用模板中的字段:{{ form.message }}