【问题标题】:Django 1.2: Custom form field?Django 1.2:自定义表单域?
【发布时间】:2011-04-20 13:39:32
【问题描述】:

我有一个动态表单,其中包含一个或多个 MultipleChoiceFields 或 ChoiceFields。我想向用户显示指令,例如对于 ChoiceField:“选择以下一项”,对于 MultipleChoiceField:“选择以下任何一项”

我该怎么做?我尝试对这些字段中的每一个进行子类化,但我无法在模板中取回值。

谢谢

编辑

我尝试了类似的方法:

class MultiWithInstruction(forms.MultipleChoiceField):
    def __init__(self, instruction=None, **kwargs):
        self.instruction=instruction
        return super(MultiWithInstruction, self).__init__(**kwargs)

我无法在模板中检索“instruction”的值。

【问题讨论】:

  • 请告诉我们您是如何将字段添加到表单中的,以及您如何尝试在模板中检索instruction 的值!

标签: django django-forms


【解决方案1】:

我遇到了同样的问题。我找不到简单的方法(不覆盖 django.forms 中的很多东西),所以我想出了这个快速而简单的解决方案。

定义一个新的模板过滤器,将一个字符串拆分成一个列表,给定一个分隔符;请参阅 Ciantic 的this simple snippet。将 sn-p 保存为templatetags/whatever_name.py

forms.py 中,用您的帮助和说明字符串填充字段的help_text 属性,用“#”分隔(当然,您可以选择任何您想要的分隔符);像

my_field = forms.MultipleChoiceField(help_text = '%s#%s' % (help_string, instruction_string), ...)

help_text 是一个字符串(已标记为安全),因此您不能在其中放入列表(这就是需要自定义拆分过滤器的原因)。

这是一个模板示例,显示表单中每个字段的帮助和说明字符串:

{% load whatever_name %}

{% for field in form %}
    help: {% filter split:"#"|first %}{{ field.help_text }}{% endfilter %}
    instruction: {% filter split:"#"|last %}{{ field.help_text }}{% endfilter %}
{% endfor %}

显然,您不能使用as_pas_tableas_ul 来呈现表单。

【讨论】:

    【解决方案2】:

    您可以在表单字段中设置标签值:

    myfield = forms.MultipleChoiceField(label='Select any of the following')
    

    【讨论】:

    • 我也已经在使用它了。我需要添加一个额外的字段,例如标签或帮助文本
    • 表单实例就像任何 Python 对象一样。您可以将属性设置为您喜欢的任何内容。例如,假设您将表单创建为 form = MyForm(),然后您可以设置 form.additional_label = 'This is my text'。在您的模板中,您可以调用 {{ form.additional_label }} 并输出值。
    【解决方案3】:

    为什么不直接使用help_text

    class MyForm(forms.Form):
        my_field = forms.MultipleChoiceField(help_text='Pick one of these', ....)
    

    然后在模板中你可以这样做:

    <p>{{ field.label_tag }}: {{ field }}</p>
    {% if field.help_text %}<p class="help_text">{{ field.help_text|safe }}</p>{% endif %}
    

    【讨论】:

      猜你喜欢
      • 2011-12-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-02
      • 1970-01-01
      • 2018-02-06
      相关资源
      最近更新 更多