【问题标题】:Django Admin override displayed field valueDjango Admin 覆盖显示的字段值
【发布时间】:2017-06-07 18:37:47
【问题描述】:

我有以下型号:

class Model(models.Model):

    creator = models.ForeignKey(User,related_name='com_creator',on_delete=models.SET_NULL, blank=True, null=True)
    username = models.CharField(max_length=60,default="")
    created = models.DateTimeField(auto_now_add=True)
    body = models.TextField(max_length=10000,default=" ")
    subtype = models.CharField(_("SubType"),max_length=100)
    typ = models.CharField(_("Type"),max_length=50)
    plus = models.ManyToManyField(User,related_name='com_plus', verbose_name=_('Plus'), blank=True)
    is_anonymous = models.BooleanField(_('Stay Anonymous'), blank=True, default=False)

typ 和 subtype 中的值是代码,例如:“6_0_p”,(因为原始值很长,所以我使用代码和 dict 来翻译成人类可读的形式)。

问题:如何在 django admin 中截取这些值并将它们转换为人类可读的形式?

这是我迄今为止尝试过的:

class ModelAdmin(admin.ModelAdmin):
    model = Model
    extra = 1
    exclude = ("username","creator","plus" ) 
    readonly_fields = ('subtype','typ','is_anonymous','created')
    fields = ('body','subtype','typ')

    def typ(self, obj):
        self.typ = "ppp"
        obj.typ = "ppp"
        return "pppp"

我尝试返回对象、self 和其他一些值。我还尝试设置值而不使用仅声明“typ ='xxx'”的可调用对象。没有。我可能不明白整个事情是如何运作的......

任何想法都会受到赞赏。

【问题讨论】:

    标签: django django-models django-admin


    【解决方案1】:

    您需要创建一个与您的方法名称相对应的readonly_field,然后从该方法返回任何内容。

    这里的文档: https://docs.djangoproject.com/en/1.11/ref/contrib/admin/#django.contrib.admin.ModelAdmin.readonly_fields

    class MyAdmin(admin.ModelAdmin):
        readonly_fields = ('my_custom_field',)
    
        def my_custom_field(self, obj):
            return 'Return Anything Here'
    

    【讨论】:

    • 我的示例代码中确实有这种方法。它没有这样做。
    • @stefan 如果您有一个名称相同的数据库字段,它将不起作用。将该方法命名为您现有字段以外的名称,并将其放在 readonly_fields 中。粘贴上面的示例并查看它是否有效。将my_custom_field 添加到您的readonly_fields 的末尾,并添加一个名称相同的方法以查看它的运行情况。
    【解决方案2】:

    我认为您的代码不起作用,因为 方法 名称与字段相同。

    您必须更改字段的名称,例如字段元组中的 _typ,然后添加一个名为 _typ 的方法,该方法返回任何内容或某些 obj 属性。

    即:

    class ModelAdmin(admin.ModelAdmin):
        model = Model
        extra = 1
        exclude = ("username","creator","plus" ) 
        readonly_fields = ('subtype','typ','is_anonymous','created')
        fields = ('body','subtype','_typ')
    
        def _typ(self, obj):
            return "pppp"
    

    【讨论】:

    • 现在显示:“FieldError: Unknown field(s)”
    • 虞姬下面给我详细解释了。你的回答在技术上也是正确的,但我从你的努力中理解了它。也非常感谢你。
    猜你喜欢
    • 2013-04-28
    • 1970-01-01
    • 2020-04-13
    • 1970-01-01
    • 1970-01-01
    • 2017-05-26
    • 1970-01-01
    • 2021-10-18
    • 2020-05-21
    相关资源
    最近更新 更多