Python 无法获取django模板标记以返回unicode
我正在编写一个应用程序,它将跟踪两名玩家之间的一系列比赛。我正在使用Django的Python 无法获取django模板标记以返回unicode,python,django,unicode,django-templates,Python,Django,Unicode,Django Templates,我正在编写一个应用程序,它将跟踪两名玩家之间的一系列比赛。我正在使用Django的User模型,并用我自己的UserProfile对其进行扩展 我在User中存储用户名作为他们的steam ID(例如:76561197965801299),然后在登录时查找他们的steam用户名,并更新UserProfile 我不想看76561197965801299,我想看一个用户名,在一个页面上,我想用更多的好东西装饰这个用户名,所以我写了一个模板标签 问题: 我似乎无法从模板标记打印unicode数据 实际
User
模型,并用我自己的UserProfile
对其进行扩展
我在User
中存储用户名作为他们的steam ID(例如:76561197965801299
),然后在登录时查找他们的steam用户名,并更新UserProfile
我不想看76561197965801299,我想看一个用户名,在一个页面上,我想用更多的好东西装饰这个用户名,所以我写了一个模板标签
问题:
我似乎无法从模板标记打印unicode数据
实际错误:
“ascii”编解码器无法对位置16:序号中的字符u'\u260e'进行编码
不在范围内(128)
通常Django不会为unicode问题困扰我(例如:我可以在管理页面中看到这个unicode对象,没有问题),但我从未尝试应用模板标记,因此显然我在这里做错了什么
模板/ladder/match_game_listing.html
{{ match.challengee|steam_name }}
本例中的match.challengee
是76561197971597000
梯形图/模板标签/梯形图过滤器.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
来自django导入模板的
从django.contrib.auth.models导入用户
从django.core.exceptions导入ObjectDoesNotExist
从django.utils.html导入标记_safe
从cafe.models导入用户配置文件
register=template.Library()
@register.filter()
def蒸汽_名称(名称):
尝试:
user\u obj=user.objects.get(username=name)
user\u prof=UserProfile.objects.get(user\u id=user\u obj.id)
url=用户\教授url
handle=unicode(用户\教授handle)
化身=用户\教授化身
steam_string=“”.格式(url、句柄、化身)
返回标记\u安全(蒸汽\u串)
#非蒸汽实体可以存在,忽略
除ObjectDoesNotExist外:
返回名称
当我在浏览器中查看此内容时,会出现上述错误:
UnicodeEncodeError at/梯形图/dota2/'ascii'编解码器无法编码
第16位的字符u'\u260e:序号不在范围内(128)
有一个有用的提示:
Unicode错误提示
无法编码/解码的字符串为:oose☎
我曾多次尝试浏览Django文档,也尝试过使用
force_text()
,但都无济于事,但由于我不太清楚为什么这样做不起作用,我可能错过了相关部分。此模板标记适用于名称没有unicode的情况 我可能认为这很简单,而且是错误的,但是,如果你只是告诉django它是一个unicode,把字母“u”放在字符串之前
比如:
unicodeString = "ís"
string = u"this -> %s my unicode string" % unicodeString
如果我完全不理解你的问题,我很抱歉。(我无法发表评论,所以我发布了答案)
从阅读本文中得到:
你为什么要把这个标在保险箱上?事实并非如此。如果没有HTML转义,格式化参数中的任何HTML特殊字符都可能导致HTML注入漏洞,从而导致XSS攻击。此外,您的撇号也被错误转义:
"alt='{1}\'s profile'"
\'
是Python字符串文字转义;您将返回字符串:
alt='someone's profile'
这意味着您将永远看不到的配置文件
后缀,因为它不是属性值的一部分
建议:
from django.utils.html import escape
...
return mark_safe(
u'<a href="{0}" alt="{1}\'s profile">'
u'<img src="{2}" alt="{1}\'s avatar">{1}'
u'</a>'
).format(escape(url), escape(handle), escape(avatar))
从django.utils.html导入转义
...
安全返回标记(
u“
).格式(转义(url)、转义(句柄)、转义(化身))
有帮助吗?哦,天哪,我觉得自己很傻。这正是问题所在。想得太多了,非常感谢。我在Python 2上使用了来自uuu future uuuu导入unicode文本的,无论我走到哪里都使用unicode。这段代码是错误的-您的unicodeString是一个bytestring(使用源代码编码编码),在插值过程中它将使用sys.getdefaultencoding()进行解码。如果这些编码不匹配,您将得到不正确的结果或异常。但是,既然句子开头有一个“u”,那么在将值赋给字符串时,它不会转换为unicode吗?谢谢,这也是我所希望的-我觉得我在这方面做了一些非常错误的事情。这非常有帮助。
alt='someone's profile'
from django.utils.html import escape
...
return mark_safe(
u'<a href="{0}" alt="{1}\'s profile">'
u'<img src="{2}" alt="{1}\'s avatar">{1}'
u'</a>'
).format(escape(url), escape(handle), escape(avatar))