Django:在admin中仅显示表单的文本

时间:2009-06-15 22:19:26

标签: django forms text admin

对于听起来很容易的事情,我有一些问题寻找答案。我有这个模型:

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)

每当我在admin中保存我执行预保存操作(save_model())时,将name + creator(例如:i_am_legend_cyber_valdez)的slugged值传递给name_slug,我想要做的就是在admin中完全使用name_slug文本框纯文本,无需使用管理模板。这可能吗?

1 个答案:

答案 0 :(得分:2)

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

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