Тип объекта вместо определенного значения из def __unicode__ отображается в админке

Согласно link1 и link2 Я сделал модель, которая указана в другая модель как kierunek = models.ForeignKey('Kierunek', default=1) и как имя выбора, показать self.nazwa_kierunku. Все работает нормально, но я не могу заставить def __unicode__ работать. Я также пробовал def __str__. Всегда есть название "Объект Керунек".

Один из моих примеров кода. Я пробовал много вариантов этого:

from django.db import models

class Kierunek(models.Model):
    nazwa_kierunku = models.CharField('Nazwa kierunku', max_length=100)
    created = models.DateTimeField('Timecreated', auto_now_add=True, null=True)
    modified = models.DateTimeField('Timeupdated', auto_now=True, null=True)
    def __unicode__(self):
        return self.nazwa_kierunku

class Meta:
    verbose_name = "Nazwa kierunku"
    verbose_name_plural = "Nazwy kierunkow"

person RaV    schedule 28.04.2015    source источник
comment
в Python 3 нет типа unicode, поэтому нет магического метода __unicode__.   -  person Eevee    schedule 28.04.2015


Ответы (1)


Предполагая, что вы используете pyhton 3

__str__() and  __unicode__() methods

В Python 2 объектная модель определяет методы str() и unicode(). Если эти методы существуют, они должны возвращать str (байты) и unicode (текст) соответственно.

Оператор print и встроенный вызов str вызывают str(), чтобы определить удобочитаемое представление объекта. Встроенный юникод вызывает unicode(), если он существует, в противном случае возвращается к str() и декодирует результат в системной кодировке. И наоборот, базовый класс Model автоматически наследует str() от unicode() путем кодирования в UTF-8.

В Python 3 есть просто str(), которая должна возвращать str (текст).

(Также можно определить bytes(), но приложения Django мало используют этот метод, потому что они почти никогда не работают с байтами.)

Django предоставляет простой способ определить методы str() и unicode(), которые работают на Python 2 и 3: вы должны определить str( ) метод, возвращающий текст, и применить декоратор python

from __future__ import unicode_literals
from django.utils.encoding import python_2_unicode_compatible

@python_2_unicode_compatible
class MyClass(object):
    def __str__(self):
        return "Instance of my class"
unicode_compatible().

В Python 3 декоратор не работает. В Python 2 он определяет соответствующие методы unicode() и str() (заменяя исходный метод str() в процессе). Вот пример:

from __future__ import unicode_literals
from django.utils.encoding import python_2_unicode_compatible

@python_2_unicode_compatible
class MyClass(object):
    def __str__(self):
        return "Instance of my class"

Этот метод лучше всего соответствует философии портирования Django.

Для прямой совместимости этот декоратор доступен, начиная с Django 1.4.2.

Наконец, обратите внимание, что repr() должна возвращать строку во всех версиях Python.

Источник https://docs.djangoproject.com/en/1.8/topics/python3/#str-and-unicode-methods

person lapinkoira    schedule 28.04.2015