2010-01-06 25 views
0

我在我的Django應用程序(在別處維護)中使用一些第三方模板標籤,將用戶名作爲字符串返回,我可以在我的模板中訪問這個。自定義Django模板標籤查找字符串用戶名並將其作爲用戶對象返回

{% for user in gr.user.foll.list %} 

{{user}} 

麻煩的是,因爲{{用戶}}返回一個字符串 - 我需要轉換成一個Django用戶對象,如果它在Django的數據庫是否存在,或者設置一個varible未註冊的,如果不是,所以我可以做之類的東西:

{ user.get_profile.about }} # get profile information 

所以我想我會寫我的第一個Django模板標籤,所以我可以用這樣的:

{% webapp_user_lookup user %} # my custom tag 
    {% ifnot unRegistered %} 
    {{ user.get_profile.about }} # get profile information - would fail with a string 
    {% endifnot %} 
{% endfor %} 

我在其他地方使用,以查找用戶在視圖中的代碼是:

try: 
     user = User.objects.get(username__iexact=user) 
     unRegistered = False 
     if not other_user.is_active: 
       unRegistered = True 
except: 
     unRegistered = True 

不過看着我無法理解如何更好地構建自定義模板標籤,把我的用戶名字符串Django模板標籤的例子 - 並返回結果爲對象(如果存在),或者設置一個可變的如果不是和原始字符串。我真的想更好地理解結構是如何工作的,如果我需要一個'班',如果是的話,爲什麼。 (我是編程新手)。

回答

3

使用模板過濾器像這樣:

{{username|get_user}} 
在user_template_tags.py

from django import template 
from django.contrib.auth.models import User 

register = template.Library() 

######################## 

def get_user(username): 
    try: 
     user = User.objects.get(username__iexact=username) 
    except User.DoesNotExist: 
     user = User.objects.none() 
    return user 

register.filter('get_user',get_user) 

然後在你的模板,你可以這樣做:

{% with username|getuser as user %} 
{% if user %}DO USER STUFF 
{% else %}DO UNREGISTERED STUFF 
{% endif %} 
{% endwith %} 
+0

注意,如果你把{{用戶}}我也用{{username}} – 2010-01-06 20:40:11

+0

,除非你在用戶的保存m中補償了它ethod,django可以存儲JOESHMO和joeshmo的用戶名,這會引發錯誤。如果沒有處理,您可以離開「User.DoesNotExist」部分。 – 2010-01-06 20:42:55

+0

布蘭登這看起來很簡單,我可以理解你的代碼 - 我現在只想和它一起玩,感謝你花時間寫出這樣一個清晰的例子。 – 2010-01-06 20:49:30

相關問題