2011-06-16 78 views
3

我試圖讓自定義模板標記正常工作,但當我在for循環中將迭代中的多個項應用於標記時遇到一些困難。Django:for循環中的自定義模板標記錯誤

我想讓標籤看起來如下,只顯示文本「工作」,如果我的權限函數評估爲True。

模板代碼

{% load permission_tags %} 
{% for group in groups %} 
<div>{% permission request.user can_edit_group on group %}WORKED{% endpermission %}</div> 
{% endfor %} 

標籤基本上發生在用戶實例,一個權限字符串(即「can_edit_group」),「開」關鍵字(只是爲了語法不錯)和對象實例來檢查權限。

我在這裏的權限框架我認爲工作正常,不是我的問題的一部分。我遇到的困難是

"Caught AttributeError while rendering: 'User' object has no attribute 'resolve'" 
templatetags/permission_tags.py in render, line 23 (I've marked line 23 below) 

for循環包含多個組時出現模板錯誤。這個標籤只用一個組就可以很好地工作,但如果我添加多個標籤,就會彈出。

模板標籤調用templatetags權限/ permission_tags.py

from django import template 
register = template.Library() 

def permission(parser, token): 
    try: 
     tag_name, username, permission, onkeyword, object = token.split_contents() 
    except ValueError: 
     raise template.TemplateSyntaxError("%r tag requires exactly 4 " 
       "arguments" % token.contents.split()[0]) 
    nodelist = parser.parse(('endpermission',)) 
    parser.delete_first_token() 
    return PermissionNode(nodelist, username, permission, object) 


class PermissionNode(template.Node): 
    def __init__(self, nodelist, user, permission, object): 
     self.nodelist = nodelist 
     self.user = template.Variable(user) 
     self.permission = permission 
     self.object = template.Variable(object) 

    def render(self, context): 

     self.user = self.user.resolve(context) # <---- Line 23 
     self.object = self.object.resolve(context) 

     # My custom permissions code. I don't think it's 
     # causing the error I am experiencing 
     permissions_obj = self.object.permissions(self.user) 

     content = self.nodelist.render(context) 

     # My custom permissions code. I don't think it's causing 
     # the error. 
     if hasattr(permissions_obj, self.permission): 
      perm_func = getattr(permissions_obj, self.permission) 
      if perm_func(): 
       return content 
     return "" 

register.tag('permission', permission) 

你有爲什麼當我在有一個以上的項目爲循環這個模板標籤產生一個錯誤,但我成功當任何想法只有一個?

我還不完全理解這個模板標籤語法的所有內部工作原理,所以我有一種感覺,我在某個地方犯了一個邏輯錯誤。任何意見非常感謝。

謝謝 喬

回答

4

當你變回self.userUser實例這裏:

self.user = self.user.resolve(context) 

它的工作原理是第一次,但下一次,因爲self.user不再是template.Variable實例,您將得到以下異常:'用戶'對象沒有'解析'屬性「

一種解決方案是保存user & object比如在局部變量:

def render(self, context): 

    user_inst = self.user.resolve(context) 
    object_inst = self.object.resolve(context) 

    permissions_obj = object_inst.permissions(user_inst) 

    content = self.nodelist.render(context) 

    if hasattr(permissions_obj, self.permission): 
     perm_func = getattr(permissions_obj, self.permission) 
     if perm_func(): 
      return content 
    return "" 
+0

這一解決辦法似乎很好地工作。謝謝! – 2011-06-16 13:41:07

+0

不客氣。 – manji 2011-06-16 14:11:16