好吧,听起来很简单,我在寻找答案时遇到了一些问题。我有这个型号:
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文本框-只是不使用管理模板。这可能吗?
无论是在 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 属性,但这不是必需的,除非您正在进行更深入的自定义。
class PageAdmin(admin.ModelAdmin):
fields = ["creator", "name", "name_slug"]
readonly_fields = ["name_slug"]