Django / Python:单引号导致Django管理界面抛出错误

时间:2015-07-29 23:02:00

标签: python django unicode

我是django的新手,正在写一个推特克隆来学习它。

我有一个类似以下的模型

class message(models.Model):
    text = models.TextField()
    date_n_time = models.DateTimeField(default=datetime.now, null=True,blank=True)
    parent_2 = models.ForeignKey('self',null=True,blank=True)    
    def __unicode__(self):
        return str(self.id)+"_"+self.text+"_"+str(self.date_n_time)+"_"+"___"+str(self.parent_2)

现在,我添加了一条文本等于以下内容的消息(引号是我通过Django创建表单输入的内容。

  

'刺'

我试图通过管理界面访问邮件对象:127.0.0.1:8000 / admin / core / message /

我在

中收到以下错误消息
  

' ASCII'编解码器不能解码位置9中的字节0xe2:顺序不在   范围(128)。您传递了消息:[错误的Unicode数据](类   ' core.models.message&#39)

其他堆栈溢出答案似乎表明这是unicode问题,但如果我将测试更改为

  

"刺"

我没有收到任何错误。

为什么我只用单引号收到错误?如何通过django表单/模型代码捕获此问题,最好是在保存输入表单时?

2 个答案:

答案 0 :(得分:3)

我会尝试将您的unicode更改为以下内容:

def __unicode__(self):
    return u'{}"_"{}"_"{}"_""__"{}'.format(self.id, self.text, self.date_n_time, self.parent_2)

那应该返回你最初想要的东西,包括引号。我还会考虑将"_""__"的部分与"___"结合起来。如果下划线彼此跟随,则没有真正的理由将它们分开。

如果您不想要引号,只需删除它们即可。保留{}。与"%s" % (context)

相比,它是一种更可靠的格式

祝你的克隆好运!

答案 1 :(得分:2)

您使用的是Python2.7还是Python3?如果您使用的是Python2.7,请使用__unicode__(),否则请使用__str__()

请查看此link的“__str__ or __unicode__?”部分。为了正确使用,请查看__unicode__()__str__()的文档。

修改
我无法复制你的错误。我可以访问管理员就好了。你有没有机会使用旧版本的Django(早于1.8)? Test

尝试使用它,因为这被认为是处理Django文档认可的unicode字符串的正确方法。

def __unicode__(self):
    return u'%s_%s_%s___%s' % (self.id, self.text, self.date_n_time, self.parent_2)