自定义Django模板标签查找字符串用户名并返回用户对象
我在我的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 %}