Django MultiValueField

时间:2017-04-15 22:27:10

标签: django django-widget django-multiwidget

我正在与一些Django挣扎,我想在那里制作一个自定义的MultiValueField和MultiWidget。我读过misc。教程,但似乎我错过了一些东西 - 大多数都很旧,我怀疑这可能是原因。

我正在使用Django 1.10。

目标:创建一个自定义字段,为表单提供三个下拉列表。到目前为止,对下拉列表的内容没有要求 - 首先我只想在我的表单中看到它们: - )

我有一个fields.py文件,其中包含:

from django import forms
from widgets import MyCustomWidget

class MyCustomField(forms.MultiValueField):
  widget = MyCustomWidget

  def __init__(self, *args, **kwargs):
    fields = (
      forms.CharField(max_length=31),
      forms.CharField(max_length=31),
      forms.CharField(max_length=31),
    )
    super(MyCustomField, self).__init__(fields, *args, **kwargs)

  def compress(self, data_list):
    return "-".join(data_list)

然后是widgets.py,其中包含:

import re
from django import forms

class MyCustomWidget(forms.MultiWidget):
  def __init__(self, attrs=None):
    widgets = (
      forms.widgets.Select(attrs=attrs, choices=[("1", "1")]),
      forms.widgets.Select(attrs=attrs, choices=[("2", "2")]),
      forms.widgets.Select(attrs=attrs, choices=[("3", "3")]),
    )
    super(MyCustomWidget, self).__init__(widgets, attrs)


  def decompress(self, value):
    if value:
      return re.split(r"\-", value)
    return [None, None, None]

forms.py:

from django.forms import ModelForm
from django import forms

class MyCustomForm(forms.ModelForm):
  class Meta:
    model = MyCustomModel
    fields = ("name")

  name = forms.CharField(widget=MyCustomField)

这在迁移时工作正常,但我尝试查看表单,我收到此错误:

'MyCustomField' object has no attribute 'is_hidden'

我试图在MyCustomField中实现此属性,但后来又出现了另一个错误:

'MyCustomField' object has no attribute 'attrs'

这些属性应该由forms.MultiValueField提供,据我所知 - 因此我不需要自己编写它们。

在模板中,我只使用" {{form}}"因为我不想使用Django的默认布局。

我在这里疯了,希望有人能够帮助走正确的道路: - )

亲切的问候, 卡斯帕

1 个答案:

答案 0 :(得分:0)

我相信您的错误在于您设置名称的那一行 name = forms.CharField(widget=MyCustomField)。我还没有测试代码。

from django.forms import ModelForm
from django import forms

class MyCustomForm(forms.ModelForm):
    class Meta:
        model = MyCustomModel
        fields = ("name")

    name = MyCustomField # This I believe is will fix your error