2011-06-23 106 views
2

我的形式是Django的:如何通過CSS來form.as_ul

class Form(forms.Form): 
    ability = forms.ChoiceField(widget= forms.CheckboxSelectMultiple(), choices = SKILLS, required=False) 

我正在顯示它作爲{{ Form.as_ul }}

我如何通過一個css UL類呢?我可以在模板中的某處做到嗎?不知道這是如何工作的

回答

7

不幸的是,你必須創建一個新的窗口小部件,但可以使用現有的CheckboxSelectMultiple widget的__init__render功能。

向構造函數添加新的ul_attrs參數。

from django import forms  
from django.forms.util import flatatt 
from django.utils.safestring import mark_safe 

class MyCheckboxSelectMultiple(forms.CheckboxSelectMultiple): 
def __init__(self, attrs=None, ul_attrs=None): 
    self.ul_attrs = ul_attrs 
    super(MyCheckboxSelectMultiple, self).__init__(attrs) 

def render(self, name, value, attrs=None, choices=()): 
    html = super(MyCheckboxSelectMultiple, self).render(name, value, attrs, choices) 
    final_attrs = self.build_attrs(self.ul_attrs) 
    return mark_safe(html.replace('<ul>','<ul%s>' % flatatt(final_attrs))) 

在您的形式簡單地使用自定義部件:

class Form(forms.Form): 
    ability = forms.ChoiceField(widget= MyCheckboxSelectMultiple(ul_attrs={"class":"fancybox"}), choices = SKILLS, required=False) 
    # 
+0

我在django 1.3中測試它 – Lepi

0

您可以通過參數attrs將HTML屬性傳遞給小部件。另外,請看Django bookchapter 7,尤其是部分定製表格設計

節傳情:

雖然很方便的爲我們生成表單的HTML,在很多情況下,你會想覆蓋默認的顯示。 {{ form.as_table }}和朋友在開發應用程序時是有用的快捷方式,但所有關於表單顯示方式的內容都可以被覆蓋,大部分都在模板本身內,您可能會發現自己正在執行此操作。

0

因爲Django的1.11,您可以Overriding built-in widget templates

class MyCheckboxSelectMultiple(forms.CheckboxSelectMultiple): 
    template_name = 'widgets/multiple_input.html' 

和複製

django/forms/widgets/multiple_input.html,其中包括由django/forms/widgets/checkbox_select.html

your_app/templates/widgets目錄。


現在,在your_app/templates/widgets/multiple_input.html文件中自定義類或樣式。