【问题标题】:Django MultiValueFieldDjango 多值字段
【发布时间】:2017-09-11 21:56:31
【问题描述】:

我正在与一些 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]

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 的默认布局。

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

亲切的问候, 卡斯帕

【问题讨论】:

    标签: django django-widget django-multiwidget


    【解决方案1】:

    我相信你的错误在于你设置名字的那一行 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
    

    【讨论】:

    • 在 Stack Overflow 上通常不鼓励仅代码的答案,因为它们可能难以理解。请考虑添加一段左右的内容来解释您为什么认为这是错误所在,并将您所拥有的内容与您认为他们的错误所在进行比较。
    猜你喜欢
    • 2020-10-21
    • 1970-01-01
    • 2012-08-21
    • 2013-09-20
    • 1970-01-01
    • 1970-01-01
    • 2013-04-27
    相关资源
    最近更新 更多