Джанго не может отобразить model.id в форме изменений? - PullRequest
2 голосов
/ 15 апреля 2011

У меня есть сообщение модели, данные которого я хотел бы отобразить в модели администратора Favorite.

Почтовая модель:

class Post(models.Model):
    nickname = models.CharField(max_length=50, default="anonymous")

    def __unicode__(self):
        return self.id

Любимая модель:

class Favorite(models.Model):
    user = models.ForeignKey(User, unique=False)
    post = models.ForeignKey(Post, unique=False)

    def __unicode__(self):
        return self.user.username

    def get_post_nickname(self):
        return self.post.nickname

Любимый администратор:

class FavoriteAdmin(admin.ModelAdmin):
    #fields = ('user', 'get_post_nickname')
    list_display= ('user', 'post')

    def save_model(self, request, obj, form, change):
        obj.save()

admin.site.register(Favorite, FavoriteAdmin)
  1. Если я использую код как таковой, когда я пытаюсь добавить Избранное через его Admin, я получаю следующую ошибку:

    Печатная ошибка TypeError при рендеринге: приведение к Unicode: нужна строка или буфер, int найдено

  2. ОК, поэтому он не любит отображать целое число, поэтому я подумал, что я просто выведу псевдоним, начиная с поля Char. Я раскомментировал первую строку в FavoriteAdmin (), чтобы вызвать FavoriteModel.get_post_nickname (). Теперь я получаю следующую ошибку:

«FavoriteAdmin.fields» относится к полю «get_post», которое отсутствует в форме.

Как я могу решить оба # 1 и # 2? Разве невозможно вызвать метод в fields ()? Я думал, что это будет, так как list_display () принимает метод.

Ответы [ 3 ]

5 голосов
/ 15 апреля 2011
  1. Я обычно делаю это:

    class Post(models.Model):
        nickname = models.CharField(max_length=50, default="anonymous")
    
        def __unicode__(self):
            return u"%s" % self.id
    
  2. Поля (docs) - это способ управления макетом страниц администратора «добавить» и «изменить». Для вас не имеет смысла включать методы в список полей, которые предназначены не только для отображения. Следовательно list_display позволяет вам включать методы.

1 голос
/ 15 апреля 2011

Вы изменили сообщение. __unicode__ () Подпрограмма возвращает int!

Это не проблема при использовании значений по умолчанию.

Несколько особых случаев, которые следует отметить относительно list_display:

Если поле имеет значение ForeignKey, Django отобразит __unicode__() из связанный объект.

1 голос
/ 15 апреля 2011

Python ожидает Unicode-строку, но в обоих случаях вы передаёте ей что-то другое.

В обоих случаях простое приведение к строке в юникоде должно решить проблему.

return unicode(self.id)

и

return unicode(self.post.nickname)

edit: На самом деле вам не нужно разыгрывать эту часть, извините. Только int, приведенный к unicode, должен решить обе проблемы.

...