1

我正在为一些 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 的默认布局。

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

亲切的问候,卡斯帕

4

1 回答 1

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
于 2018-09-12T20:37:15.013 回答