自定义渲染django形式的辐射选择/访问单个元素?

时间:2010-06-07 13:28:17

标签: django forms django-forms

我有一个这样的表格:

CHOICES = [  
           ('a', 'a_value'),  
           ('b', 'b_value'),  
           ('c', 'c_value')  
]  

self.fields["choice"] = forms.ChoiceField(  
    widget=RadioSelect(),  
    choices=CHOICES,   
)  

如何在模板中选择此表单字段的单个元素?我希望能够做到这样的事情:

<tr><td>{{form.choice.a}}</td><td>some custom extra field</td></tr>

还是有另一种方法来改变RadioSelect的呈现方式吗?

3 个答案:

答案 0 :(得分:7)

查看完整文档 - https://docs.djangoproject.com/en/dev/ref/forms/widgets/#radioselect

{% for radio in form.my_radio_select %}
- {{ radio.choice_label }}
- {{ radio.tag }}
{% endfor %}

答案 1 :(得分:1)

您无法通过参数或其他方式执行此操作,呈现方式在其窗口小部件类中是硬编码的!见例如。 http://code.djangoproject.com/browser/django/trunk/django/forms/widgets.py:RadioSelect.render( - &gt; RadioFieldRenderer.render);将其子类化并覆盖render方法,然后在表单myfield = forms.MultipleChoiceField(widget=MyWidget(...))中使用它。

答案 2 :(得分:1)

我花了几个小时试图在RadioSelect上找到一些使用自定义渲染器的方法,但没有办法传递选择号。相反,我去了一个kludgey,但简单的方法。在我的表单中添加了__init__函数:

def __init__(self, *args, **kwargs):
    super(FormName, self).__init__(*args, **kwargs)
    self.radiofield_choice = re.findall(r'<li>(.+?)</li>',
                                        unicode(self['radiofield_name']))

使用RadioSelect的默认渲染来创建窗口小部件,然后解析单个选择HTML。您甚至可以将其与定义的选项组合以创建字典而不是列表。

在我的模板中,我使用{{ form.radiofield_choice.0|safe }}来渲染第一个项目。增加零以获得其他项目。

如果出于某种原因,只需要不包含标签的输入字段,请使用r'(<input.+/>)'