我有一个模型Post,其数据我想在模型Favorite的Admin中显示。
发布模型:
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)
如果我这样使用代码,当我尝试通过其管理员添加收藏夹时,会出现以下错误:
渲染时捕获TypeError:强制转换为Unicode:需要字符串或缓冲区,找到int
好的,所以它不喜欢显示整数,所以我想我只会显示昵称,因为它是一个Charfield。我取消注释了FavoriteAdmin()中的第一行以调用FavoriteModel.get_post_nickname()。现在我收到以下错误:
'FavoriteAdmin.fields'指的是表单中缺少的字段'get_post'。
我如何解决#1和#2?是不是可以在fields()中调用方法?我认为这是因为list_display()接受了一个方法。
答案 0 :(得分:5)
我通常这样做:
class Post(models.Model):
nickname = models.CharField(max_length=50, default="anonymous")
def __unicode__(self):
return u"%s" % self.id
字段(docs
)是如何控制管理“添加”和“更改”页面的布局。如果能够在不仅仅显示的字段列表中包含方法,那将是没有意义的。因此list_display允许您包含方法。
答案 1 :(得分:1)
Python期待一个unicode字符串,但在这两个实例中,你都在为它提供其他东西。
在这两个实例中,对unicode字符串的简单转换应该可以解决问题。
return unicode(self.id)
<击>和击>
<击>return unicode(self.post.nickname)
击> <击> 撞击>
编辑:您实际上并不需要投射那部分,抱歉。只需将int转换为unicode就可以解决这两个问题。
答案 2 :(得分:1)
您已更改帖子。__unicode__
()例程以返回int!
This is not a problem using the defaults.
关于list_display的一些特殊情况:
如果字段是
ForeignKey
,Django将显示__unicode__()
相关的对象。