2010-06-07 76 views
4

我有一个这样的形式:自定义呈现django形式的radioselect /访问单个元素?

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的呈现方式吗?

回答

1

你不能通过参数或其他东西来做到这一点,它的呈现方式是在它的widget类中硬编码的!见例如。 http://code.djangoproject.com/browser/django/trunk/django/forms/widgets.py:RadioSelect.render( - > RadioFieldRenderer.render);子类并覆盖渲染方法,然后以myfield = forms.MultipleChoiceField(widget=MyWidget(...))的形式使用它。

+0

再多一次thing..is有没有办法将参数传递给我的子类的渲染?当我尝试传递参数时,它说该对象不可调用。 – Oli 2010-06-08 09:14:43

+0

你想传递什么? – 2010-06-08 10:07:21

1

我努力了几个小时,试图找到某种方式来使用RadioSelect上的自定义渲染器,但无法传递选择编号。相反,我选择了一个简单的方法。在增加了一个__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.+/>)'