Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 无法获取django模板标记以返回unicode_Python_Django_Unicode_Django Templates - Fatal编程技术网

Python 无法获取django模板标记以返回unicode

Python 无法获取django模板标记以返回unicode,python,django,unicode,django-templates,Python,Django,Unicode,Django Templates,我正在编写一个应用程序,它将跟踪两名玩家之间的一系列比赛。我正在使用Django的User模型,并用我自己的UserProfile对其进行扩展 我在User中存储用户名作为他们的steam ID(例如:76561197965801299),然后在登录时查找他们的steam用户名,并更新UserProfile 我不想看76561197965801299,我想看一个用户名,在一个页面上,我想用更多的好东西装饰这个用户名,所以我写了一个模板标签 问题: 我似乎无法从模板标记打印unicode数据 实际

我正在编写一个应用程序,它将跟踪两名玩家之间的一系列比赛。我正在使用Django的
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))