Eu estou aprendendo Django usando o Tutorial do projeto Django. Como eu uso o python 2.7, não consigo implementar o seguinte no Python 2.7:
from django.db import models
class Question(models.Model):
# ...
def __str__(self): # __unicode__ on Python 2
return self.question_text
class Choice(models.Model):
# ...
def __str__(self): # __unicode__ on Python 2
return self.choice_text
Respostas:
12 para resposta № 1Para manter o código compatível entre py2 e py3, a melhor maneira é usar o decorador python_2_unicode_compatible
. Desta forma você pode manter o str método:
from django.db import models
from django.utils.encoding import python_2_unicode_compatible
@python_2_unicode_compatible
class Question(models.Model):
# ...
def __str__(self): # __unicode__ on Python 2
return self.question_text
@python_2_unicode_compatible
class Choice(models.Model):
# ...
def __str__(self): # __unicode__ on Python 2
return self.choice_text
Referência: https://docs.djangoproject.com/en/1.8/topics/python3/#str-and-unicode-methods
Django fornece uma maneira simples de definir str() e unicode() métodos que funcionam no Python 2 e 3: você deve definir um str() retornando texto e aplicando o decorador python_2_unicode_compatible ().
...
Essa técnica é a melhor combinação para a filosofia de portabilidade do Django.
6 para resposta № 2
Sim você pode, você acabou de substituir __str__
com __unicode__
, como o comentário afirma:
class Question(models.Model):
# ...
def __unicode__(self):
return self.question_text
class Choice(models.Model):
# ...
def __unicode__(self):
return self.choice_text
Mais abaixo nessa seção você encontrará um pouco de explicação:
__str__
ou__unicode__?
No Python 3, é fácil, basta usar
__str__()
.No Python 2, você deve definir
__unicode__()
métodos retornando valores unicode. Os modelos do Django têm um padrão__str__()
método que chama__unicode__()
e converte o resultado para um bytestring utf-8. Isso significa queunicode(p)
retornará uma string Unicode estr(p)
retornará um bytestring, com caracteres codificados como utf-8. Python faz o oposto: o objeto tem um__unicode__
método que chama__str__
e interpreta o resultado como um teste de ASCII. Essa diferença pode criar confusão.
o question_text
e choice_text
os atributos retornam valores Unicode já.