31

label_tag()フォーム フィールドのメソッドの出力にクラス属性を追加する方法が必要です。

辞書を渡す機能があることがわかりattrs、シェルでテストしたところ、次のようなことができます。

for field in form:
    print field.label_tag(attrs{'class':'Foo'})

出力に が表示class='Foo'されますが、テンプレートから引数を追加する方法がわかりませんattrs。実際、テンプレートはそれに対して特別に設計されていますね。

フォーム定義で、ラベルに表示されるクラスを定義する方法はありますか?

フォームでは、次のようにして入力にクラスを与えることができます

self.fields['some_field'].widget.attrs['class'] = 'Foo'

のクラスも出力する必要があり<label />ます。

4

9 に答える 9

21

テクニック 1

フィルターが「エレガントではない」という別の回答の主張に問題があります。ご覧のとおり、非常にエレガントです。

@register.filter(is_safe=True)
def label_with_classes(value, arg):

    return value.label_tag(attrs={'class': arg})

テンプレートでこれを使用すると、エレガントです。

{{ form.my_field|label_with_classes:"class1 class2"}}

テクニック 2

あるいは、私が見つけた興味深い手法の 1 つに、* を必須フィールドに追加するというものがあります

適切に設定された属性でそれを呼び出す BoundField.label_tag のデコレーターを作成します。次に、BoundField.label_tag を呼び出すと装飾された関数が呼び出されるように、BoundField にモンキー パッチを適用します。

from django.forms.forms import BoundField

def add_control_label(f):
    def control_label_tag(self, contents=None, attrs=None):
        if attrs is None: attrs = {}
        attrs['class'] = 'control-label'
        return f(self, contents, attrs) 
    return control_label_tag

BoundField.label_tag = add_control_label(BoundField.label_tag)    
于 2012-07-20T17:49:31.413 に答える
11

次のように、forms.py のフォーム フィールドに CSS クラスを追加するのはどうでしょうか。

class MyForm(forms.Form):
    title = forms.CharField(widget=forms.TextInput(attrs={'class': 'foo'}))

次に、テンプレートで次のことを行います。

<label for="id_{{form.title.name}}" class="bar">
    {{ form.title }}
</label>

もちろん、これはテンプレートの for ループ タグ内で機能するように簡単に変更できます。

于 2009-12-19T18:16:02.380 に答える
8

カスタム テンプレート タグが解決策のようです。カスタム フィルターも使用できますが、洗練されていない場合があります。ただし、どちらの場合もカスタム フォーム レンダリングにフォールバックする必要があります。

これが非常に重要なタスクである場合。フォーム フィールドにラベル クラスで注釈を付け、それらのクラスを使用してフォーム レンダリング メソッドを提供できるようにする Mixin を作成します。次のコードが機能するように:

{{ form.as_table_with_label_classes }}

しかし、私は尋ねたいです; ラベルタグにクラスが本当に必要ですか? つまり、HTML のデザインに関してです。そこにクラスを追加することは絶対に必要ですか?次のようなCSSで解決できませんでした:

encapsulating_selector label {
    some-attr: some-value;
}

私は時々 、次のような場合にjQueryを使用します。機能すればページは改善されますが、機能しなくても大惨事にはなりません。そして、HTML ソースをできるだけスリムに保ちます。

于 2009-01-06T08:00:00.127 に答える
2

少し遅すぎますが、同様の問題に遭遇しました。これがお役に立てば幸いです。

class MyForm(forms.ModelForm):

    def __init__(self, *args, **kwargs):
        super(MyForm, self).__init__(*args, **kwargs)
        self.fields['myfield1'].widget.attrs.update(
            {'class': 'form-control'})
        self.fields['myfield2'].widget.attrs.update(
            {'class': 'form-control'})

    def as_two_col_layout(self):

        return self._html_output(
            normal_row='<div class="form-group"><span class="col-xs-2">%(label)s</span> <div class="col-xs-10">%(field)s%(help_text)s</div></div>',
            error_row='%s',
            row_ender='</div>',
            help_text_html=' <span class="helptext">%s</span>',
            errors_on_separate_row=True)

    class Meta:

        model = mymodel
        fields = ['myfield1', 'myfield2']
于 2015-01-30T11:59:59.683 に答える
1
class CustomBoundField(BoundField):
    def label_tag(self, contents=None, attrs=None):
        if self.field.required:
            attrs = {'class': 'required'}
        return super(CustomBoundField, self).label_tag(contents, attrs)

class ImportViewerForm(forms.Form):
    url = fields.URLField(widget=forms.TextInput(attrs={'class': 'vTextField'}))
    type = fields.ChoiceField(choices=[('o', 'Organisation'), ('p', 'Program')], widget=forms.RadioSelect,
                              help_text='Url contain infornation about this type')
    source = fields.ChoiceField(choices=[('h', 'hodex'), ('s', 'studyfinder')], initial='h', widget=forms.RadioSelect)

    def __getitem__(self, name):
        "Returns a BoundField with the given name."
        try:
            field = self.fields[name]
        except KeyError:
            raise KeyError('Key %r not found in Form' % name)
        return CustomBoundField(self, field, name)

class Media:
    css = {'all': [settings.STATIC_URL + 'admin/css/forms.css']}

BoundField クラスのメソッド label_tag を変更し、フォームで使用する必要があります

于 2013-08-30T11:08:07.647 に答える
0
@register.simple_tag
def advanced_label_tag(field):
    """ Return form field label html marked to fill by `*` """
    classes = []
    attrs = {}
    contents = force_unicode(escape(field.label))

    if field.field.required:
        classes.append(u'required')
        contents = force_unicode('%s <span>*</span>'%escape(field.label))

    if classes:
        attrs['class'] = u' '.join(classes)

    return field.label_tag(contents=contents, attrs=attrs)
于 2011-05-31T18:52:51.863 に答える