【问题标题】:Django form doesn't output custom class attributes for inputsDjango 表单不为输入输出自定义类属性
【发布时间】:2015-01-15 21:13:06
【问题描述】:

我正在尝试使用 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

...我尝试通过小部件设置属性:

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 创建表单实例和模板并渲染它,它会包含类,所以我怀疑视图级别一定发生了一些事情。

有什么想法吗?

【问题讨论】:

    标签: django django-forms django-templates


    【解决方案1】:

    您需要在视图中使用自定义表单。如果你没有为 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-01-13
      • 1970-01-01
      • 2018-07-01
      • 1970-01-01
      • 2014-01-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多