2009-12-01 40 views
2

我已經看到了我怎麼能寫設置基於這樣如何寫出更好的模板標籤在Django

{% my_template_tag 'blah' as my_context_variable %} 

但我希望能夠做到這一點的模板的上下文變量模板標籤:

因爲兩者groupuser在上下文中設置視圖

{% is_in_group group user as is_member %} 

{% if is_member %} 
    #.... do stuff .... 
{% endif %} 

或最好是這樣的:

{% if is_in_group group user %} 
    # .... 
{% end if %} 

顯然輪的另一種方式是隻設置在視圖is_member - 但這僅僅是一個例子,將是一件好事知道如何做這樣的事情呢!

回答

13

葉夫根尼已與smart_if模板標籤是一個好主意。但是,如果這不起作用,您可能會發現自定義過濾器比較容易編寫這種比較。喜歡的東西:

@register.filter 
def is_in(obj, val): 
    return val is in obj 

,你會使用這樣的:

{% if user|is_in:group.users %} 
+0

天才。使用過濾器而不是標籤 - 沒有想到這一點! – 2009-12-02 08:42:25

+0

'val is in obj'是無效的語法,應該是'val in obj' – yedpodtrzitko 2012-10-23 13:50:57

4

{{ perms.model_name.permission_name }}怎麼了? (自帶django.core.context_processors.auth。)

Django組只是權限的集合,允許或禁止訪問特定項目應由個人許可。或者,如果你真的想寫你自己的標籤或過濾器,有lots of documentation。如果這不起作用,還有其他模板語言可以用來做你想做的更好的事情。

但是,我希望寫一個標籤是不必要的。 Django非常擅長已經想出你真正想做的事情。有時需要一點挖掘才能發現。

+0

對不起 - 使用'groups'的是有點令人困惑 - 在這種情況下,我在我的應用程序(不是身份驗證組)中設置了組,並且特別想查看當前用戶是否是當前「組」的成員 - 如果沒有,則顯示「加入組」按鈕,如果所以,顯示一個「離開組」按鈕。 – 2009-12-02 08:44:16

3

嘗試這種使用smart if標籤:

{% if group in user.groups %} 
    ... 
{% endif %} 
0

丹尼爾的過濾器應該做的伎倆。作爲一個模板標籤也可能是這樣的:

未經檢驗

class IsInGroupNode(Node): 
    def __init__(self, group, user, varname): 
     self.member = template.Variable(user) 
     self.group = template.Variable(group) 
     self.varname = varname 


    def render(self, context): 
     self.group = self.group.resolve(context) 
     self.user = self.user.resolve(context) 
     context[self.varname] = self.user in self.group.user_set.all() 
     return '' 


def is_in_group(parser, token): 
    bits = token.contents.split() 
    #some checks 
    return IsInGroupNode(bits[1], bits[2],bits[4]) 

is_in_group = register.tag(is_in_group) 

在模板中,你會用你的標記簽名

{% is_in_group group user as is_member %}