我正在编写一个应用程序来跟踪 2 名玩家之间的一系列比赛。我正在使用 Django 的User
模型并用我自己的UserProfile
.
我将用户名存储User
为他们的 SteamID(例如:)76561197965801299
,然后在登录时查找他们的 Steam 用户名,然后更新UserProfile
.
我不想看76561197965801299
,而是想看一个用户名,在一个页面上,我想用更多好东西来装饰这个用户名,所以我写了一个模板标签。
问题:
我似乎无法从我的模板标签打印 unicode 数据。
实际错误:
'ascii' 编解码器无法在位置 16 编码字符 u'\u260e':序数不在范围内(128)
通常 Django 不会因为 unicode 问题而困扰我(例如:我可以在管理页面中看到这个 unicode 对象没问题),但我从未尝试过应用模板标签,所以显然我在这里做错了。
模板/梯子/match_game_listing.html
{{ match.challengee|steam_name }}
在match.challengee
这种情况下是76561197971597000
。
梯子/模板标签/ladder_filters.py
from django import template
from django.contrib.auth.models import User
from django.core.exceptions import ObjectDoesNotExist
from django.utils.html import mark_safe
from cafe.models import UserProfile
register = template.Library()
@register.filter()
def steam_name(name):
try:
user_obj = User.objects.get(username=name)
user_prof = UserProfile.objects.get(user_id=user_obj.id)
url = user_prof.url
handle = unicode(user_prof.handle)
avatar = user_prof.avatar
steam_string = "<a href='{0}' alt='{1}\'s profile'><img src='{2}' alt='{1}\'s avatar' >{1}</a>".format(url, handle, avatar)
return mark_safe(steam_string)
# Non-steam entities can exist, ignore
except ObjectDoesNotExist:
return name
当我在浏览器中查看时,我收到上述错误:
/ladder/dota2/'ascii' 编解码器的 UnicodeEncodeError 无法对位置 16 中的字符 u'\u260e' 进行编码:序数不在范围内(128)
有一个有用的提示:
Unicode 错误提示
无法编码/解码的字符串是:oose ☎</p>
我已经尝试过无数次浏览 Django 文档,但我尝试过玩force_text()
但无济于事,但由于我有点不清楚为什么这不起作用,我可能只是错过了相关部分。此模板标签适用于名称没有 unicode 的情况。