Django:仅显示管理中表单的文本

问题描述 投票:0回答:2

好吧,听起来很简单,我在寻找答案时遇到了一些问题。我有这个型号:

class Page(models.Model):
    creator       = models.TextField(blank=False)
    name          = models.CharField(max_length=70, primary_key=True)
    name_slug     = models.SlugField(max_length=70, unique=True)

每当我在管理中保存时,我都会执行预保存操作(save_model()),将名称+创建者的slugged值(例如:i_am_legend_cyber_valdez)传递给name_slug,我想要做的就是完全在管理文本中创建name_slug文本框-只是不使用管理模板。这可能吗?

django forms text admin
2个回答
2
投票

无论是在 ModelAdmin.formfield_overrides 或 ModelAdmin.formfield_for_dbfield 中,还是在自定义 ModelForm 中,您都需要将自定义小部件分配给 name_slug 字段,该字段仅显示该字段的值,而不是显示 HTML 表单输入。 您可以在这里找到这样的小部件。

编辑:我不会详细介绍创建自定义小部件的细节,因为您可以只使用我上面链接到的小部件。 要为模型中的所有 SlugField 启用此小部件,最简单的方法是使用 formfield_overrides:

class PageAdmin(admin.ModelAdmin):
    formfield_overrides = {
        models.SlugField: {'widget': ReadOnlyWidget},
    }

如果您的模型中有多个 SlugField,并且只想将 ReadOnlyWidget 应用于其中之一,则可以重写 formfield_for_dbfield 方法:

class PageAdmin(admin.ModelAdmin):
    def formfield_for_dbfield(self, db_field, **kwargs):
        if db_field.name == 'name_slug':
            kwargs['widget'] = ReadOnlyWidget
        return super(PageAdmin, self).formfield_for_dbfield(db_field, **kwargs)

您还可以为您的模型创建一个完全自定义的 ModelForm 并将其分配给 ModelAdmin 的 form 属性,但这不是必需的,除非您正在进行更深入的自定义。


0
投票

使用readonly_fields

class PageAdmin(admin.ModelAdmin):
    fields = ["creator", "name", "name_slug"]
    readonly_fields = ["name_slug"]
© www.soinside.com 2019 - 2024. All rights reserved.