1

好的,听起来很容易,我在寻找答案时遇到了一些问题。我有这个模型:

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()),将名称 + 创建者(例如:i_am_legend_cyber_valdez)的 slugged 值传递给 name_slug,我想要做的是完全在管理员中创建 name_slug 文本框纯文本无需使用管理模板。这可能吗?

4

1 回答 1

2

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

编辑:我不会详细介绍创建自定义小部件,因为您可以使用我上面链接到的那个。要为模型中的所有 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 属性,但除非您进行更深入的自定义,否则这不是必需的。

于 2009-06-16T11:29:00.173 回答