2011-05-23 41 views
2

我有一個調查應用程序,可以創建動態大小的表單。我在問題被修正的地方使用公式「question_id_part」,id是被問到的問題的id,部分是三部分之一。Django模板標籤以獲取特定的表單域

在我的模板中,我需要能夠按類別對它們進行分組,所以我循環調查中的類別,獲取該類別中的所有問題,然後使用模板標籤來獲取表單字段。

{% 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應該以某種方式作爲場上的方法來訪問 - 但對於我的生活,我無法弄清楚這種方法會是什麼。我錯過了明顯的東西嗎?

+0

輕度的意識模糊,你是動態創建的字段或只是想在窗體上訪問現有的場? – 2011-05-23 21:34:31

+0

只是試圖訪問現有的字段。 – Ted 2011-05-23 21:36:48

+0

好問題,我一直在努力,直到我降落在這裏。在模板中,我們可以簡單地執行'form.field_name',但如果我們將相同的'form'對象傳遞給模板標籤,則它不一樣。 – Anupam 2017-10-11 09:55:55

回答

2

嘗試:在這裏行101

@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) 

參見方法定義:django/forms/forms.py

+0

應該工作,我無法想象窗體庫曾經分解__getitem__。謝謝。 – Ted 2011-05-23 22:28:53

+0

很好的答案。一段時間之後,我一直在這裏掙扎,直到我降落在這裏。謝謝! – Anupam 2017-10-11 09:56:29