【问题标题】:Django: How can I show a list of values in a text input field?Django:如何在文本输入字段中显示值列表?
【发布时间】:2011-02-06 14:47:42
【问题描述】:

我已经定义了一个带有 ManyToManyField 的模型,我希望该字段显示由空格连接的值,例如:

<input type="text" name="foo" value="val1 val2 val3"/>

我已经定义了使用 CharField 来表示多个值的表单:

class MyForm(ModelForm):
    foo = CharField(label='Foo')
    class Meta:
        model = MyModel

值不显示由空格分隔的值,而是显示如下:

[u'val1', u'val2', u'val3']

如何覆盖此行为?

【问题讨论】:

  • 这只是为了显示,还是用户可以修改与此表单的关系?
  • 用户应该能够修改关系。我实现了一个 clean 方法,它拆分值并验证每个元素,以及一个视图,它接受清理后的输入并将元素添加到相关集合中。
  • 我查看了 MultiWidget 和 MutliValueField,但对于我正在做的事情,它们似乎有太多的障碍。看起来应该很简单……

标签: python django forms


【解决方案1】:

您有一个基本的误解,即字段本身不负责它们的呈现方式。这就是widgets 所做的。

【讨论】:

  • 到目前为止,我还没有找到执行上述操作的小部件示例。浏览widgets.py 中的代码并没有让它变得更清晰。
【解决方案2】:

好的,我终于想通了:

class MultiValueTextWidget(TextInput):
    def _get_value(self, value):
        return " ".join(value)

    def _format_value(self, value):
        if self.is_localized:
            return formats.localize_input(self._get_value(value))
        return self._get_value(value)

我之前曾尝试过(在发布原始问题之前),但我认为我的字段声明有问题。当我使用这样的小部件实例化字段时,它可以工作:

markets = CharField(widget=MultiValueTextWidget(), label='Ticker symbols')

由于某种原因,我遇到了麻烦:

class Meta:
    widgets = {
        'markets': MultiValueTextWidget()
        }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多