Джанго не может отобразить model.id в форме изменений?

У меня есть пост модели, данные которого я хотел бы отобразить в админке модели 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. Если я использую код как таковой, когда я пытаюсь добавить Favorite через его Admin, я получаю следующую ошибку:

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

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

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

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

3 ответа

Решение
  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 позволяет вам включать методы.

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

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

return unicode(self.id)

а также

return unicode(self.post.nickname)

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

Вы изменили пост.__unicode__() рутина, чтобы вернуть int!

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

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

Если поле является ForeignKeyДжанго отобразит __unicode__() связанного объекта.

Другие вопросы по тегам