我正在与一些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的默认布局。
我在这里疯了,希望有人能够帮助走正确的道路: - )
亲切的问候, 卡斯帕
答案 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