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

Django:在管理中仅显示表单的文本,django,forms,text,admin,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) 每当我在a

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

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)的段塞值传递给name_slug,我要做的是完全将name_slug文本框设置为admin文本,而不使用管理模板。这可能吗?

在ModelAdmin.formfield\u覆盖中,或者在ModelAdmin.formfield\u for\u dbfield中,或者在自定义ModelForm中,您需要为name\u slug字段分配一个自定义小部件,该字段只显示字段的值,而不显示HTML表单输入。你可以找到这样一个小部件

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

如果您的模型中有多个slugfield,并且只想将ReadOnlyWidget应用于其中一个,那么您应该覆盖formfield\u for\u 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属性,但除非您正在进行更深入的自定义,否则这是不必要的。

我不确定“纯文本”是什么意思。你想让它显示它,但你不能编辑name_slug的值吗?好吧,这两种情况都可以,但是,如果可能的话,我也喜欢纯文本的替代方案。嗯,你能教我怎么做吗,我看过小部件文档,但没有那么好的文档。
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)