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

Posted

技术标签:

【中文标题】Django 表单不为输入输出自定义类属性【英文标题】:Django form doesn't output custom class attributes for inputs 【发布时间】: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 formendfor 循环遍历字段

如果我使用manage.py shell 创建表单实例和模板并渲染它,它会包含类,所以我怀疑视图级别一定发生了一些事情。

有什么想法吗?

【问题讨论】:

【参考方案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

【讨论】:

以上是关于Django 表单不为输入输出自定义类属性的主要内容,如果未能解决你的问题,请参考以下文章

模型表单上的 Django 自定义设置大小属性不起作用

模板和隐藏输入中的自定义 Django 表单

Android Gradle 插件自定义 Gradle 任务 ⑬ ( DefaultTask 中的任务输入和输出属性 | TaskInputs 任务输入接口 | FileCollection )

Django中的Form表单验证

使用提供 HTML 输出的文本格式选项创建表单输入

Django - 自定义表单,特别是字段的外观