【问题标题】:Django can't display model.id in change form?Django 无法以更改形式显示 model.id?
【发布时间】:2011-08-06 00:32:00
【问题描述】:

我有一个模型帖子,我想在模型收藏夹的管理员中显示其数据。

后模型:

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()。现在我收到以下错误:

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

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

【问题讨论】:

  • 我认为这里有一个错误。我肯定写了2. OK so it doesn't like to display an Integer,,但不知何故,数字“2”显示为“1”,所以有两个数字“1”。很奇怪。
  • list_display中get_post_id是什么?
  • 糟糕,对不起!我已将其更改为“发布”,但没有正确复制粘贴。我的错。
  • 在分解您的有序列表的报价之前放置一个空格,以保持编号正确。

标签: django django-admin admin


【解决方案1】:
  1. 我通常这样做:

    class Post(models.Model):
        nickname = models.CharField(max_length=50, default="anonymous")
    
        def __unicode__(self):
            return u"%s" % self.id
    
  2. Fields (docs) 是如何控制管理员“添加”和“更改”页面的布局。能够将方法包含在不只是用于显示的字段列表中是没有意义的。因此 list_display 允许您包含方法。

【讨论】:

    【解决方案2】:

    Python 需要一个 unicode 字符串,但在这两种情况下,您都在为其提供其他内容。

    在这两种情况下,对 unicode 字符串的简单转换应该可以解决问题。

    return unicode(self.id)
    

    return unicode(self.post.nickname)
    

    编辑:您实际上不需要投射该部分,抱歉。只需将 int 转换为 unicode 即可解决这两个问题。

    【讨论】:

    • 另外,您也应该将默认值更改为 unicode 字符串。让它u'anonymous'
    • 关于 unicode 的好点,谢谢。我实际上为#2粘贴了错误的错误消息,对不起。看来我无法将方法作为 fields() 的参数调用?
    【解决方案3】:

    您已更改 post.__unicode__() 例程以返回一个 int!

    This is not a problem using the defaults.

    关于 list_display 需要注意的几个特殊情况:

    如果字段是ForeignKey,Django 将显示__unicode__() 的 相关对象。

    【讨论】:

    • 感谢您的回答。是的,我知道我为此更改了 unicode。我不认为 Django 会被 int 难倒……
    • 我实际上为 #2 粘贴了错误的错误消息,抱歉。看来我无法将方法作为 fields() 的参数调用?
    猜你喜欢
    • 2020-09-21
    • 2016-08-15
    • 2012-02-07
    • 2017-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多