2011-02-16 67 views
2

我想呈現django表單部件radioselect到表而不是ul列表。第一行爲標籤,第二行爲單選按鈕。每個按鈕一個單元格。例如django radioselect渲染到表

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

我看了默認selectradio組件,但是渲染功能似乎很複雜,要求許多不同的類來完成的渲染每一部分。

有沒有人有任何如何做到這一點或可以提供一個簡單的解決方案的例子?

回答

2

你需要繼承django.forms.widgets.RadioFieldRenderer並重寫它的渲染方法。 然後在你的表格,聲明你字段中指定的自定義渲染用於微

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

只需填寫一份更有點貝雷斯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)」那樣直接渲染對象。

我希望有幫助!

0

如果您需要進一步自定義輸入元素,請覆蓋自定義渲染器上的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源代碼,改性僅略微顯示中的每一個簡單的定製的應用程序。