Django表单不输出输入的自定义类属性

时间:2014-11-18 15:54:20

标签: django django-forms django-templates

我尝试使用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创建表单实例和模板并进行渲染,则它包含类,因此我怀疑视图级别必定会发生一些事情。

有什么想法吗?

1 个答案:

答案 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