创建仅显示(不可编辑)Django管理字段

2024-09-21 07:54:21 发布

您现在位置:Python中文网/ 问答频道 /正文

是否可以构建一个自定义的模型字段/小部件组合,该组合显示一个值,但从不将任何内容写回数据库?我只在管理员的表单中使用这个小部件。

我编写了自己的字段,它覆盖formfield()方法来声明自己的widget类。它显示得很好,但只要在管理中单击“保存”按钮,就会出现验证错误:

This field is required.

考虑到我的小部件没有呈现表单字段,这是有意义的。不过,我想做的基本上是从更新过程中删除这个字段:无论何时在管理员中使用,它都不应该在SQL更新中被提及。

有可能吗?

这是我目前掌握的代码的草图:

class MyWidget(Widget):
    def render(self, name, value, attrs=None):
        if value is None:
            value = ""
        else:
            # pretty print the contents of value here
            return '<table>' + ''.join(rows) + '</table>'

class MyField(JSONField):
    def __init__(self, *args, **kwargs):
        kwargs['null'] = False
        kwargs['default'] = list
        super(MyField, self).__init__(*args, **kwargs)

    def formfield(self, **kwargs):
        defaults = {
            'form_class': JSONFormField,
            'widget': MyWidget,
        }
        defaults.update(**kwargs)
        return super(MyField, self).formfield(**defaults)

更新1:用例是该字段表示一个审计日志。在内部,它将定期写入。但是管理员不需要对它进行写入,它只需要以非常可读的格式将其呈现出来。

我没有在应用程序中使用任何其他模型表单,因此管理员是唯一的表单用户。我不想在管理类本身上实现这个行为,因为这个字段将在不同的模型中重用,并且总是应该以相同的方式执行。


Tags: 模型self表单isvalue部件管理员def
2条回答

有多种方法可以在管理页面中创建只读字段。你对数据库存储的要求有点模糊,所以我仔细考虑一下。

必须首先在admin.py中注册AdminModel:

from django.contrib import admin
from yourapp.models import YourModel

class YourAdmin(admin.ModelAdmin):
    pass

admin.site.register(YourModel, YourAdmin)

现在你可以添加不同的行为。例如,可以添加“编辑/添加”页中显示的字段列表:

class YourAdmin(admin.ModelAdmin):
    fields = ['field1', 'field2']

这可以是模型字段、模型属性或模型方法的名称。方法显示为只读。

如果希望一个字段为只读,请显式添加以下内容:

class YourAdmin(admin.ModelAdmin):
    fields = ['field1', 'field2']
    readonly_fields = ['field2']

然后您可以选择通过添加同名的方法完全覆盖字段的显示。您甚至不需要具有该名称的模型字段/方法,然后:

class YourAdmin(admin.ModelAdmin):
    fields = ['field1', 'field2']
    readonly_fields = ['field2']

    def field2(self, obj):
        return '*** CLASSIFIED *** {}'.format(obj.field2)

使用django.utils.safestring.mark_safe还可以返回HTML代码。

管理员的所有其他选项都可用,除了小部件配置,因为它只适用于可写字段。

我可能有点困惑,你想要什么,但你可能想看看模型属性。这是我当前项目的一个例子。

模型中的代码:

class Textbook(models.Model):
    #other fields

    @property
    def NumWishes(self):
        return self.wishlist_set.count()

然后你可以在管理页面上显示它。

class Textbook_table(admin.ModelAdmin):
    fields = ["""attributes that are saved in the model"""]
    list_display = ("""attributes that are saved in the model""", 'NumWishes'')

所以现在我可以在管理页面中显示NumWishes,但不需要用模型创建它。

相关问题 更多 >

    热门问题