我尝试使用ModelForms输出带有自定义CSS类的表单:
urls.py:
url(r'^mymodel/add/$',
MyModelCreate.as_view(template_name='add_MyModel.html'),
name='mymodel-add')
views.py:
from django.views.generic.edit import CreateView, UpdateView, DeleteView
from myapp.models import MyModel
class MyModelCreate(CreateView):
model=MyModel
def get_context_data(self, **kwargs):
context=super(MyModelUpdate, self).get_context_data(**kwargs)
context['css'] = settings.CSS_PATH
return context
我已经尝试覆盖基础ModelForm的 init 并循环遍历所有字段:
class MyBaseForm(forms.ModelForm):
def __init__(self, *args, **kwargs):
super(MyBaseForm, self).__init__(*args, **kwargs)
for key in self.fields:
self.fields[key].widget.attrs.update(
{'class' : 'field-class',
'placeholder':self.fields[key].label
})
我已尝试设置Form类formfield_callback
以添加默认类:
def add_field_classes(f, **kwargs):
field = f.formfield(**kwargs)
if field:
w = field.widget
if 'class' not in field.widget.attrs:
field.widget.attrs['class'] = ''
field.widget.attrs['class'] += ' form_class'
if isinstance(w, forms.widgets.SelectMultiple):
field.widget.attrs['class'] += ' multiselect'
return field
class MyModelForm(forms.ModelForm):
formfield_callback=add_field_classes
...我已经尝试通过小部件设置attrs:
class MyModelForm(forms.ModelForm):
class Meta:
fields = ('field1',)
widgets={'field1':forms.Textarea(attrs={'class':'field-class'}),}
无论我做什么,模板都会输出没有任何类的小部件;我尝试过使用{{form}}
并尝试使用{{for field in form}}{{endfor}}
如果我使用manage.py shell
创建表单实例和模板并进行渲染,则它包含类,因此我怀疑视图级别必定会发生一些事情。
有什么想法吗?
答案 0 :(得分:2)
您需要在视图中使用自定义表单。如果您没有为CreateView指定form_class,django将为您创建一个:
from django.views.generic.edit import CreateView, UpdateView, DeleteView
from myapp.models import MyModel
class MyModelCreate(CreateView):
model=MyModel
form_class = MyBaseForm
def get_context_data(self, **kwargs):
context=super(MyModelUpdate, self).get_context_data(**kwargs)
context['css'] = settings.CSS_PATH
return context