[python] Django Forms에서 CSS 클래스 정의

내가 양식을 가지고 있다고 가정

class SampleClass(forms.Form):
    name = forms.CharField(max_length=30)
    age = forms.IntegerField()
    django_hacker = forms.BooleanField(required=False)

렌더링 된 페이지의 클래스를 기반으로 jQuery를 사용할 수 있도록 각 필드에 CSS 클래스를 정의하는 방법이 있습니까?

양식을 수동으로 만들지 않기를 바랐습니다.



답변

파이썬 코드의 변경이 필요하지 않은 또 다른 솔루션은 디자이너와 일회성 프레젠테이션 변경에 더 좋습니다 : django-widget-tweaks . 누군가 유용하게 사용되기를 바랍니다.


답변

내 자신의 질문에 대답했습니다. 한숨

http://docs.djangoproject.com/en/dev/ref/forms/widgets/#django.forms.Widget.attrs

위젯 생성자로 전달되었음을 알지 못했습니다.


답변

다음은 클래스의 필드를 선언 한 후 위젯에 클래스 정의를 추가하는 또 다른 솔루션입니다.

def __init__(self, *args, **kwargs):
    super(SampleClass, self).__init__(*args, **kwargs)
    self.fields['name'].widget.attrs['class'] = 'my_class'


답변

사용 장고 – 위젯 개조하면 되겠 는 사용하기 쉽고 매우 잘 작동합니다.

그렇지 않으면 사용자 지정 템플릿 필터를 사용하여이 작업을 수행 할 수 있습니다.

다음과 같이 양식을 렌더링하는 것을 고려하십시오.

<form action="/contact/" method="post">
    {{ form.non_field_errors }}
    <div class="fieldWrapper">
        {{ form.subject.errors }}
        <label for="id_subject">Email subject:</label>
        {{ form.subject }}
    </div>
</form>

form.subject는 as_widget 메소드 가있는 BoundField 의 인스턴스입니다 .

“my_app / templatetags / myfilters.py”에서 “addcss”사용자 정의 필터를 만들 수 있습니다

from django import template

register = template.Library()

@register.filter(name='addcss')
def addcss(value, arg):
    css_classes = value.field.widget.attrs.get('class', '').split(' ')
    if css_classes and arg not in css_classes:
        css_classes = '%s %s' % (css_classes, arg)
    return value.as_widget(attrs={'class': css_classes})

그런 다음 필터를 적용하십시오.

{% load myfilters %}
<form action="/contact/" method="post">
    {{ form.non_field_errors }}
    <div class="fieldWrapper">
        {{ form.subject.errors }}
        <label for="id_subject">Email subject:</label>
        {{ form.subject|addcss:'MyClass' }}
    </div>
</form>

그러면 form.subjects는 “MyClass”CSS 클래스로 렌더링됩니다.

이 도움을 바랍니다.

편집 1

  • dimyG 의 답변 에 따라 필터 업데이트

  • django-widget-tweak 링크 추가

편집 2

  • Bhyd 의 의견 에 따라 필터 업데이트

답변

docs.djangoproject.com에서 지적한 방법으로 확장 :

class MyForm(forms.Form):
    comment = forms.CharField(
            widget=forms.TextInput(attrs={'size':'40'}))

모든 필드의 기본 위젯 유형을 알아야하는 것이 번거 롭다고 생각하고 클래스 이름을 양식 필드에 넣는 것만으로 기본값을 재정의하는 것이 재미 있다고 생각했습니다. 이것은 나를 위해 작동하는 것 같습니다 :

class MyForm(forms.Form):
    #This instantiates the field w/ the default widget
    comment = forms.CharField()

    #We only override the part we care about
    comment.widget.attrs['size'] = '40'

이것은 나에게 약간 깨끗해 보인다.


답변

양식의 모든 필드가 특정 클래스를 상속하도록하려면에서 상속 한 상위 클래스를 정의한 forms.ModelForm후 상속하십시오.

class BaseForm(forms.ModelForm):
    def __init__(self, *args, **kwargs):
        super(BaseForm, self).__init__(*args, **kwargs)
        for field_name, field in self.fields.items():
            field.widget.attrs['class'] = 'someClass'


class WhateverForm(BaseForm):
    class Meta:
        model = SomeModel

이를 통해 'form-control'코드 복제를 추가하지 않고도 응용 프로그램의 모든 형태에있는 모든 필드에 클래스를 자동으로 추가 할 수있었습니다.


답변

보기에서 변경하는 간단한 방법은 다음과 같습니다. 템플릿으로 전달하기 직전에 아래에 추가하십시오.

form = MyForm(instance = instance.obj)
form.fields['email'].widget.attrs = {'class':'here_class_name'}