【问题标题】:Django Template Tag to get specific form fieldDjango 模板标签以获取特定的表单字段
【发布时间】:2011-08-31 11:38:33
【问题描述】:

我有一个创建动态大小表格的调查应用程序。我使用公式“question_id_part”,其中问题是固定的,id 是被问问题的 id,part 是三个部分之一。

在我的模板中,我需要能够按类别对它们进行分组,因此我遍历调查中的类别,获取该类别中的所有问题,然后我有一个模板标签来获取我的表单字段。

{% load my_tags %}
...
{% for category in survey.category_set.all %}
    <h3>{{category}}</h3>
    {% for question in category.factor_set.all %}
        {% get_field_for_question_part question.id form "type" %} 
    {% endfor %}
{% endfor %}
...

然后我就有了一个对应的模板标签,看起来像这样:

@register.simple_tag
def get_field_for_question_part(question_id, form, part):
    field_name = "question_%s_%s" % (question_id, part)
    field = form.fields[field_name]
    return BoundField(form, field, field_name)

我的问题是: 通过显式导入 BoundField,我的模板标签对表单内部的工作方式了解得太多,因此对于表单的非公开行为的未来变化来说是脆弱的。因此,在我看来,BoundField 应该可以作为现场方法以某种方式访问​​——但对于我来说,我无法弄清楚该方法是什么。我错过了什么明显的东西吗?

【问题讨论】:

  • 有点困惑,您是动态创建字段还是只是尝试访问表单上的现有字段?
  • 只是尝试访问现有字段。
  • 好问题,我为此苦苦挣扎了一段时间,直到我来到这里。在模板中,我们可以简单地做form.field_name,但如果我们将相同的form 对象传递给模板标签,它就不一样了。

标签: django django-templates


【解决方案1】:

试试:

@register.simple_tag
def get_field_for_question_part(question_id, form, part):
    field_name = "question_%s_%s" % (question_id, part)
    return form.__getitem__(field_name)

在此处查看第 101 行的方法定义:django/forms/forms.py

【讨论】:

  • 应该可以,我无法想象表单库会排除 getitem。谢谢。
  • 很好的答案。挣扎了一段时间,直到我降落在这里。谢谢!
猜你喜欢
  • 1970-01-01
  • 2015-01-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-11
  • 1970-01-01
  • 2013-10-08
  • 2017-02-16
相关资源
最近更新 更多