Джанго не может отобразить 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)
Если я использую код как таковой, когда я пытаюсь добавить Favorite через его Admin, я получаю следующую ошибку:
Ошибка TypeError при рендеринге: приведение к Unicode: нужна строка или буфер, int найдено
Хорошо, так что он не любит отображать целое число, поэтому я подумал, что я просто покажу псевдоним, так как это Charfield. Я раскомментировал первую строку в FavoriteAdmin(), чтобы вызвать FavoriteModel.get_post_nickname(). Теперь я получаю следующую ошибку:
"FavoriteAdmin.fields" относится к полю "get_post", которое отсутствует в форме.
Как я могу решить оба #1 и #2? Разве невозможно вызвать метод в fields()? Я думал, что это будет, так как list_display() принимает метод.
3 ответа
Я обычно делаю это:
class Post(models.Model): nickname = models.CharField(max_length=50, default="anonymous") def __unicode__(self): return u"%s" % self.id
Поля (
docs
) как управлять макетом админских страниц "добавить" и "изменить". Для вас не имеет смысла включать методы в список полей, которые предназначены не только для отображения. Следовательно, list_display позволяет вам включать методы.
Python ожидает Unicode-строку, но в обоих случаях вы указываете что-то другое.
В обоих случаях простое приведение к Unicode-строке должно решить проблему.
return unicode(self.id)
а также
return unicode(self.post.nickname)
редактировать: вам на самом деле не нужно разыгрывать эту часть, извините. Только int, приведенный к unicode, должен решить обе проблемы.
Вы изменили пост.__unicode__
() рутина, чтобы вернуть int!
Это не проблема с использованием значений по умолчанию.
Несколько особых случаев, которые следует отметить относительно list_display:
Если поле является
ForeignKey
Джанго отобразит__unicode__()
связанного объекта.