假设我有一个表格
class SampleClass(forms.Form):
name = forms.CharField(max_length=30)
age = forms.IntegerField()
django_hacker = forms.BooleanField(required=False)
有没有一种方法可以在每个字段上定义CSS类,以便可以在渲染页面中基于类使用jQuery?
我希望不必手动构建表单。
假设我有一个表格
class SampleClass(forms.Form):
name = forms.CharField(max_length=30)
age = forms.IntegerField()
django_hacker = forms.BooleanField(required=False)
有没有一种方法可以在每个字段上定义CSS类,以便可以在渲染页面中基于类使用jQuery?
我希望不必手动构建表单。
Answers:
另一种不需要更改python代码的解决方案,因此对于设计人员和一次性演示更改更好: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'
使用django-widget-tweaks,它易于使用并且效果很好。
否则,可以使用自定义模板过滤器来完成此操作。
考虑到您以这种方式呈现表单:
<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>
然后,将使用“ MyClass” css类呈现form.subjects。
希望能有所帮助。
编辑1
根据dimyG的答案更新过滤器
添加django-widget-tweak链接
编辑2
get('class', None).split(' ')
如果标签没有将失败不具有类属性,如None
被返回。将其更改为get('class', '').split(' ')
有效
扩展指向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'
类自动添加到应用程序所有形式的所有字段中,而无需添加代码复制。
这是上述内容的一种变体,它将为所有字段提供相同的类(例如,jQuery的圆角效果很好)。
# Simple way to assign css class to every field
def __init__(self, *args, **kwargs):
super(TranslatedPageForm, self).__init__(*args, **kwargs)
for myField in self.fields:
self.fields[myField].widget.attrs['class'] = 'ui-state-default ui-corner-all'
你可以试试看
class SampleClass(forms.Form):
name = forms.CharField(max_length=30)
name.widget.attrs.update({'class': 'your-class'})
...
您可以在以下网站中查看更多信息:Django Widgets
如果您想向模板中的表单字段(而不是view.py或form.py中)添加类,例如,要在不覆盖其第三方视图的情况下修改第三方应用程序,则可以按照以下说明过滤模板在查尔斯泰克 回答很方便。但是在此答案中,模板过滤器会覆盖该字段可能具有的所有现有类。
我尝试将其添加为编辑内容,但建议将其写为新答案。
因此,这是一个尊重字段现有类的模板标记:
from django import template
register = template.Library()
@register.filter(name='addclass')
def addclass(field, given_class):
existing_classes = field.field.widget.attrs.get('class', None)
if existing_classes:
if existing_classes.find(given_class) == -1:
# if the given class doesn't exist in the existing classes
classes = existing_classes + ' ' + given_class
else:
classes = existing_classes
else:
classes = given_class
return field.as_widget(attrs={"class": classes})
事实证明,您可以在表单构造函数(init函数)中或在启动表单类之后执行此操作。如果您不编写自己的表单并且该表单来自其他地方,则有时需要这样做-
def some_view(request):
add_css_to_fields = ['list','of','fields']
if request.method == 'POST':
form = SomeForm(request.POST)
if form.is_valid():
return HttpResponseRedirect('/thanks/')
else:
form = SomeForm()
for key in form.fields.keys():
if key in add_css_to_fields:
field = form.fields[key]
css_addition = 'css_addition '
css = field.widget.attrs.get('class', '')
field.widget.attrs['class'] = css_addition + css_classes
return render(request, 'template_name.html', {'form': form})
您还可以使用Django Crispy Forms,这是定义表单的好工具,以防您需要使用Bootstrap或Foundation这样的CSS框架。在那里为表单字段指定类很容易。
您的表单类会这样:
from django import forms
from crispy_forms.helper import FormHelper
from crispy_forms.layout import Layout, Div, Submit, Field
from crispy_forms.bootstrap import FormActions
class SampleClass(forms.Form):
name = forms.CharField(max_length=30)
age = forms.IntegerField()
django_hacker = forms.BooleanField(required=False)
helper = FormHelper()
helper.form_class = 'your-form-class'
helper.layout = Layout(
Field('name', css_class='name-class'),
Field('age', css_class='age-class'),
Field('django_hacker', css-class='hacker-class'),
FormActions(
Submit('save_changes', 'Save changes'),
)
)