簡體   English   中英

Django模板中的列表未按預期工作

[英]Lists in Django templates not working as expected

如果在配置文件視圖中循環訪問我的用戶組以插入頁面的不同塊,但由於某種原因,它們並不像我期望的那樣等同。 這是模板:

{{ user_groups }}

{% for g in user_groups %}
    {{ g }}
    {% if g == "client" %}
        client things
    {% endif %}

    {% if g == "guardian" %}
        guardian things
    {% endif %}

{% endfor %}

{% for group in request.user.groups.all %}
    {{ group }}
    {% ifequal group "guardian" %}
        this is a guardian
    {% endifequal %}
{% endfor %}

{% if "guardian" in user_groups %}
     Give me some guardian stuff
{% endif %}

輸出:
[<團體:監護人>]監護人監護人


正如你所看到的,我已經用實際的用戶對象和傳遞給context []的列表完成了這個。 在這兩種情況下,列表本身都沒有問題迭代。 兩個循環都顯示原始變量輸出,但是等於操作失敗。

我可以讓它做比較像{% ifequal "something" "something" %}這將顯示if塊內的內容,但將列表元素與字符串進行比較似乎沒有任何方式我嘗試把它做完。

我知道我不能在if塊中聲明列表,但在任何情況下我都不這樣做。 有關為什么會失敗的任何想法? 我錯過了一些微不足道的事嗎?

使用{{ group }}隱式地將group對象轉換為字符串,調用它的__unicode____str__方法(取決於您的python版本)。 對於用戶組,這很可能會返回包含group.name值的group.name

但是,這種隱式轉換不會發生在if語句中(並且不應該)。 因此,字符串"guardian"永遠不能等於組對象guardian

我建議將此邏輯放入您的視圖而不是模板中,您可以在其中使用更多功能並進行實際過濾:

def myview(request):
    context['is_guardian'] = request.user.groups.filter(name='guardian').exists()
    context['is_client'] = request.user.groups.filter(name='client').exists()
    return render(request, 'my_template.html', context)

而你的模板:

{% if is_guardian %}
    ...
{% endif %}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM