对于听起来很容易的事情,我有一些问题寻找答案。我有这个模型:
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文本框纯文本,无需使用管理模板。这可能吗?
答案 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属性,但除非您进行更深层次的自定义,否则这不是必需的。