我正在为一些 Django 苦苦挣扎,我想在其中制作一个与 MultiWidget 结合的自定义 MultiValueField。我读过杂项。教程,但似乎我遗漏了一些东西 - 其中大多数都很旧,我怀疑这可能是原因。
我正在使用 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]
表格.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 的默认布局。
我在这里发疯了,希望有人能够帮助走上正确的道路:-)
亲切的问候,卡斯帕