내가 양식을 가지고 있다고 가정
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'}