2017-04-13 18 views
0

我目前正在檢查我的模板中的權限以決定是否要顯示特定的鏈接。在模板標籤中使用django權限

這都非常好,我的base.html文件是在我的正常模板延伸:

base.html文件

{% if perms.myapp.can_add %} 
    #display link 
{% endif %} 

我的模板

{% extends "riskass/base.html" %} 
{% block content %} 
    # do stuff # 
{% endblock %} 

但我還要爲模板中的重複項目使用模板標記,並且不會看到相同的權限檢查米在他們的工作。

有沒有人知道我可能會做錯什麼?謝謝 !

我的模板

{% extends "riskass/base.html" %} 

{% load show_items %} 

{% block content %} 
    # do stuff # 
    {% show_items items_list%} 
{% endblock %} 

templatetags/show_items.py

from django import template 

register = template.Library() 

@register.inclusion_tag('myapp/show_items.html') 
def show_items(items): 
    return {'items': items} 

MYAPP/show_items.html

{% for item in items%} 

    # display stuff: this works 
    ... 

    # check permissions: 
    {% if perms.myapp.can_add %} 
     #display other link: doesn't do anything 
    {% endif %} 
+0

作爲一個忠告:這是不夠的使用'{%load show_item%}',你也需要使用'{%show_item AnObject%}' – slackmart

+0

是的是在示例中忘了它,但我正確地使用它;模板標籤按預期工作,而不是其中的驗證部分 – Malcoolm

回答

0

perms是您的模板「我的模板」被渲染的模板上下文的一部分。但是,您的包含標籤模板myapp/show_item.html默認情況下有其自己的上下文,並且不會繼承perms或任何其他模板變量,除非您在標籤註冊中通過傳遞takes_context=True來安排此操作,並且只需執行一些代碼即可通過部分或全部的上下文到您的標籤模板上下文中。

有這個Django文檔的例子:

https://docs.djangoproject.com/en/1.11/howto/custom-template-tags/#inclusion-tags

這是一個有點混亂,因爲文檔似乎暗示着你可以要麼通過自己的參數標籤法通過上下文,但不是兩者。但事實並非如此。當takes_context=True傳遞給@register.inclusion_tag()時,效果是django將context作爲第一個參數傳遞給您的標記函數,接下來是您希望傳遞給您的標記的任何參數。傳遞的上下文是標籤所在的模板的上下文。這樣你就可以把你從那裏需要什麼,並把它傳遞給包括模板,如:

@register.inclusion_tag('riskass/show_ratings.html', takes_context=True) 
def show_ratings(context, ratings): 
    return { 
     'ratings': ratings, 
     'perms': context.get('perms', None) 
    } 

標籤的使用會再看看這樣的:

{% show_ratings ratings_list %} 

有這一些有用的信息其他堆棧溢出的問題和答案,但它是不完全一樣的你的問題,你可能想看一看:

Pass a context variable through an inclusion tag

+0

感謝您的解釋;基本上我必須找到一種方法將perms上下文變量傳遞給包含標記。這個技巧可行,但並不理想......:def show_ratings(items,perms = []): return { 'items':items, 'perms':perms }。你可以通過執行以下命令來調用包含標籤:{%show_items items_list perms%} – Malcoolm

+0

我不得不使用它,因爲我的items_list在整個應用中並不總是以相同的方式調用。你怎麼看 ? – Malcoolm

+1

好吧,以及Django文檔意味着你可以通過上下文或通過你自己的論點,而不是兩個。但是我看了一下Django源代碼:django/template/library.py TagHelperNode.get_resolved_arguments()似乎傳遞了上下文FIRST,然後傳遞了自己的參數。因此,您可以在您的包含標籤功能中訪問這兩者。但如果事實證明你只能擁有一個或另一個,那麼你可以像你一樣通過燙髮,或者你可以使用上下文並將你的標籤包裝在{%with%}標籤中以設置你需要的變量在上下文中改變。 –