Django无法以更改形式显示model.id?

时间:2011-04-15 02:36:30

标签: django django-admin admin

我有一个模型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)
  1. 如果我这样使用代码,当我尝试通过其管理员添加收藏夹时,会出现以下错误:

      

    渲染时捕获TypeError:强制转换为Unicode:需要字符串或缓冲区,找到int

  2. 好的,所以它不喜欢显示整数,所以我想我只会显示昵称,因为它是一个Charfield。我取消注释了FavoriteAdmin()中的第一行以调用FavoriteModel.get_post_nickname()。现在我收到以下错误:

  3.   

    'FavoriteAdmin.fields'指的是表单中缺少的字段'get_post'。

    我如何解决#1和#2?是不是可以在fields()中调用方法?我认为这是因为list_display()接受了一个方法。

3 个答案:

答案 0 :(得分:5)

  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 :(得分: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__()   相关的对象。