【问题标题】:Custom rendering a radioselect in django form / accessing single element?以 django 形式自定义呈现无线电选择/访问单个元素?
【发布时间】:2011-02-28 17:08:43
【问题描述】:

我有这样的表格:

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

【问题讨论】:

    标签: django forms django-forms


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 还有一件事..有没有办法将参数传递给我的子类渲染器?当我现在尝试传递参数时,它说该对象不可调用..
      【解决方案3】:

      我为此努力了几个小时,试图找到在 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'(&lt;input.+/&gt;)'

      【讨论】:

        猜你喜欢
        • 2015-01-12
        • 1970-01-01
        • 2021-12-09
        • 2015-08-13
        • 1970-01-01
        • 2017-09-16
        • 1970-01-01
        • 2015-10-07
        • 1970-01-01
        相关资源
        最近更新 更多