自定义Django模板标记以查找字符串用户名并将其作为用户对象返回

时间:2010-01-06 19:53:41

标签: python django django-templates

我在我的Django应用程序(在其他地方维护)中使用了一些第三方模板标签,它返回一个用户名作为我可以在我的模板中访问的字符串。

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

 {{user}}

麻烦是因为{{user}}作为字符串返回 - 我需要转换为Django用户对象,如果它存在于Django DB中,或者设置varible unRegistered如果不是这样我可以做的事情如下: / p>

 { 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 Template标签示例时,我无法理解如何最好地构建自定义模板标记,获取我的字符串用户名 - 并将结果作为对象发回(如果存在),或者设置变量如果不存在和原始字符串。我真的想更好地理解结构是如何工作的,如果我需要一个“类”,如果需要,为什么呢? (我是编程新手。)

1 个答案:

答案 0 :(得分: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 %}