【问题标题】:django radioselect render to tabledjango radioselect 渲染到表格
【发布时间】:2011-06-28 11:06:36
【问题描述】:

我想将 django 表单小部件 radioselect 呈现为表格而不是 ul 列表。第一行有标签,第二行下面有单选按钮。每个按钮一个单元格。例如

-------------------------------
| label 1 | label 2 | label 3 |
-------------------------------
|   O     |    O    |    O    |
-------------------------------

我查看了默认的 selectradio 小部件,但渲染函数似乎很复杂,调用许多不同的类来完成渲染的每个部分。

有没有人有如何做到这一点的任何例子或可以提供一个简单的解决方案?

【问题讨论】:

    标签: django django-forms django-widget


    【解决方案1】:

    如果您需要进一步自定义输入元素,请覆盖自定义渲染器上的choice_input_class 属性。

    from django.forms.widgets import RadioChoiceInput, RadioFieldRenderer   
    from django.utils.safestring import mark_safe
    from django.utils.html import format_html
    
    class MyCustomRenderer( RadioFieldRenderer ):
        choice_input_class = MyCustomInputClass
    
    class MyCustomInputClass(RadioChoiceInput):
        def render(self, name=None, value=None, attrs=None, choices=()):
            # Generate outer label, insert a custom div
            output = format_html('''
                <div id="{}"></div>
            ''', self.choice_label)
            if self.id_for_label:
                label_for = format_html(' for="{}"', self.id_for_label)
            else:
                label_for = ''
            attrs = dict(self.attrs, **attrs) if attrs else self.attrs
            return format_html('<label{}>{} {}</label>',
                               label_for, self.tag(attrs), output)
    
        def tag(self, attrs=None):
            # Generate the customized input element.
            attrs = attrs or self.attrs
            final_attrs = dict(attrs, type=self.input_type, name=self.name, value=self.choice_value)
            if self.is_checked():
                final_attrs['checked'] = 'checked'
            return format_html('<input{} class="my_custom_class" />', flatatt(final_attrs))
    

    这些 render()tag() 方法来自 1.9 源代码,仅稍作修改以显示每个中的简单自定义应用程序。

    【讨论】:

      【解决方案2】:

      只是为了填写更多 Béres Botond 的答案

      class MyForm(forms.ModelForm):
          my_field = forms.TypedChoiceField(choices=some_choices,
                                            label=u"bla",
                                            widget=forms.RadioSelect(renderer=MyCustomRenderer))
      

      自定义渲染器如下所示:

      from django import forms
      from django.forms.widgets import RadioFieldRenderer
      from django.utils.encoding import force_unicode
      from django.utils.safestring import mark_safe
      
      class MyCustomRenderer( RadioFieldRenderer ):
          def render( self ):
              """Outputs a series of <td></td> fields for this set of radio fields."""
              return( mark_safe( u''.join( [ u'<td>%s</td>' % force_unicode(w.tag()) for w in self ] )))
      

      在这种情况下,我不想要旁边的单选框的名称,所以我使用“force_unicode(w.tag())”如果你想要它旁边的名称,只需像这样直接渲染对象"force_unicode(w)"

      希望对你有帮助!

      【讨论】:

        【解决方案3】:

        您也可以使用 django-uni-form 并使用 div 代替表格。

        【讨论】:

          【解决方案4】:

          您需要继承 django.forms.widgets.RadioFieldRenderer 并覆盖它的 render 方法。 然后在您的表单中,在声明您的字段时指定小部件的自定义渲染器

          class MyForm(forms.ModelForm):
              my_field = forms.TypedChoiceField(choices=some_choices,
                                                label=u"bla",
                                                widget=forms.RadioSelect(renderer=MyCustomRenderer))
          

          【讨论】:

            猜你喜欢
            • 2013-07-27
            • 2011-11-12
            • 1970-01-01
            • 2018-07-11
            • 1970-01-01
            • 1970-01-01
            • 2018-11-13
            • 1970-01-01
            • 2011-11-29
            相关资源
            最近更新 更多