2011-06-23 4 views
2

私のフォームはジャンゴ:どのようにCSSは

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

私は{{ Form.as_ul }}

がどのように私はこれにCSSのULクラスを通過しないようにそれを表示していますですform.as_ulに渡しますか?テンプレートのどこかでそれを行うことはできますか?この動作の仕組みがわからない

答えて

7

残念ながら、あなたは、新しいウィジェットを作成する必要がありますが、既存のCheckboxSelectMultipleウィジェットの__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))) 

単にこのカスタム・ウィジェットを使用します。Djangoの1.11以来

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

私はdjango 1.3でそれをテストしました – Lepi

0

HTML属性をattrsパラメータを介してウィジェットに渡すことができます。また、Django bookchapter 7、特にのフォームデザインのセクションをご覧ください。

セクションティーザー:

それは私たちのフォームのHTMLを持っていると便利ですが、多くの場合、デフォルトのレンダリングを無効にしたいと思う、私たちのために生成されます。 {{ form.as_table }}と友人はアプリケーションを開発する際に便利なショートカットですが、フォームの表示方法については、ほとんどがテンプレート自体の中で上書きすることができます。

0

を、次のことができOverriding built-in widget templates

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

django/forms/widgets/checkbox_select.htmlに含ま

django/forms/widgets/multiple_input.htmlをコピー

~

your_app/templates/widgetsディレクトリ。


your_app/templates/widgets/multiple_input.htmlファイルでクラスまたはスタイルをカスタマイズしてください。