自定义Django模板标签查找字符串用户名并返回用户对象

0 投票
1 回答
1928 浏览
提问于 2025-04-15 17:42

我在我的Django应用中使用了一些第三方模板标签(这些标签在别的地方维护),它们返回一个用户名,像这样我可以在我的模板中访问它。

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

 {{user}}

问题是因为{{user}}返回的是一个字符串——我需要把它转换成Django的用户对象,如果这个用户在Django数据库中存在的话。如果不存在,我需要设置一个变量叫unRegistered,这样我就可以做一些事情,比如:

 { 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模板标签的例子,我发现很难理解如何最好地构建这个自定义模板标签,来接收我的字符串用户名——并返回一个对象(如果存在的话),或者如果不存在则设置一个变量和原始字符串。我真的很想更好地理解这个结构是怎么工作的,以及我是否需要一个“类”,如果需要的话,为什么要用它。(我刚开始学习编程)。

1 个回答

4

使用一个模板过滤器,像这样:

{{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 %}

撰写回答