Django管理员覆盖显示的字段值

3pmvbmvn  于 2023-01-14  发布在  Go
关注(0)|答案(3)|浏览(162)

我有以下型号:

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'"。什么都没有。我可能不明白整个事情是怎么工作的...
任何想法都将不胜感激。

snvhrwxg

snvhrwxg1#

您需要创建一个对应于方法名的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'
h43kikqp

h43kikqp2#

我认为您的代码不起作用,因为方法名称与字段相同。
您必须更改字段的名称,如字段元组中的_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"
mwngjboj

mwngjboj3#

在Django 4及以上版本中,您可以轻松添加自定义(只读)字段,如下所示:

class FooAdmin(admin.ModelAdminAbstractAdmin):
    readonly_fields = [
        '_dynamic_field',
    ]
    fieldsets = [
        ('Form', {
            'fields': (
                '_dynamic_field',
            ),
            'classes': ('form-group',)
        }),
    ]

    def _dynamic_field(self, obj=None):
        if obj is not None:
            return 'Bar'
        return "Foo"

    # to change the label
    _dynamic_field.__name__ = "Dynamic field label"

您可以看到,字段也需要在readonly_fieldsfieldsets中。

相关问题