Djangos模板語言在模板中並沒有給你很多邏輯(如果你想改變它,我已經聽到了有關Jinja2的積極信息)。還有"Smart" {% if %}標籤,它增加了更多的功能,並且順便提出將其包含在Django 1.2中。
至於解決這個問題,我很可能將邏輯轉移到視圖。 (免責聲明:沒有測試此代碼段的時間,但它應該提供的總體思路)
def my_view(request, *args, **kwargs):
# QuerySet is fetched however it's done...
regs = Regs.objects.all()
# Wrap regs in display information
checked = False
radio_buttons = []
for r in regs:
if r.editable:
if not checked:
radio_buttons.append({ 'checked':True, 'enabled':True, 'object':r })
# Set to true once
checked = True
else:
radio_buttons.append({ 'checked':False, 'enabled':True, 'object':r })
else:
radio_buttons.append({ 'checked':False, 'enabled':False, 'object':r })
# Then pass in radio_buttons for the value of regs down here
render_to_whatever(..., { 'regs':radio_buttons })
在這種情況下,我們已經包裹查詢集,這將給我們的模板有關呈現一些細節。模板現在變成了「啞巴」。
{% for r in regs %}
<input type="radio" value="{{ forloop.counter }}"
{% if r.checked %}checked="checked"{% endif %}
{% if not r.enabled %}disabled="disabled"{% endif %}/>
{% comment %} To access the original object use: {{ r.object }} {% endcomment %}
{% endfor %}
順便說一句,我沒有使用洞Django,只是模板引擎,所以我不能將這個邏輯移動到視圖:) – 2009-11-22 17:15:18