/ / Usando o método __str __ () no Django em Python 2 - python, django, python-2.7, django-models

Usando o método __str __ () no Django em Python 2 - python, django, python-2.7, django-models

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 № 1

Para 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 que unicode(p) retornará uma string Unicode e str(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á.