虽然这里已经分享了一些很好的功能性解决方案,但我觉得非表单标记,例如辅助图像标签,属于模板,而不是附加到 Django 表单小部件或在模型管理类中生成。更语义化的解决方案是:
管理模板覆盖
注意:显然我的声誉不够高,无法发布两个以上的简单链接,因此我在以下文本中创建了注释,并在此答案的底部包含了相应的 URL。
来自Django Admin Site documentation:
覆盖管理模块用来生成管理站点各个页面的许多模板相对容易。您甚至可以为特定应用或特定模型覆盖其中一些模板。
Django 的django.contrib.admin.options.ModelAdmin(通常在命名空间django.contrib.admin.ModelAdmin 下访问)提供了一系列可能的Django's template loader 模板路径,从最具体到不太具体。这个sn-p是直接从django.contrib.admin.options.ModelAdmin.render_change_form复制过来的:
return TemplateResponse(request, form_template or [
"admin/%s/%s/change_form.html" % (app_label, opts.model_name),
"admin/%s/change_form.html" % app_label,
"admin/change_form.html"
], context)
因此,考虑到前面提到的 Django 管理模板覆盖文档和模板搜索路径,假设有人创建了一个应用程序“文章”,其中定义了一个模型类“文章”。如果想要覆盖或扩展仅模型articles.models.Article 的默认Django 管理站点更改表单,可以执行以下步骤:
- 为覆盖文件创建一个模板目录结构。
- 虽然文档没有提及,但如果
APP_DIRS1 设置为 True,模板加载器将首先查看应用目录。
- 因为想要通过应用标签和模型覆盖 Django 管理站点模板,所以生成的目录层次结构将是:
<project_root>/articles/templates/admin/articles/article/
- 在新的目录结构中创建模板文件。
- 只有管理员更改表单需要被覆盖,所以创建
change_form.html。
- 最终的绝对路径为
<project_root>/articles/templates/admin/articles/article/change_form.html
- 完全覆盖或只是扩展默认的管理员更改表单模板。
- 我无法在 Django 文档中找到有关默认管理站点模板可用的上下文数据的任何信息,因此我不得不查看 Django 源代码。
- 默认更改表单模板:github.com/django/django/blob/master/django/contrib/admin/templates/admin/change_form.html
- 一些相关的上下文字典定义可以在
django.contrib.admin.options.ModelAdmin._changeform_view 和 django.contrib.admin.options.ModelAdmin.render_change_form
我的解决方案
假设我在模型上的 ImageField 属性名称是“文件”,我实现图像预览的模板覆盖将类似于:
{% extends "admin/change_form.html" %}
{% block field_sets %}
{% if original %}
<div class="aligned form-row">
<div>
<label>Preview:</label>
<img
alt="image preview"
src="/{{ original.file.url }}"
style="max-height: 300px;">
</div>
</div>
{% endif %}
{% for fieldset in adminform %}
{% include "admin/includes/fieldset.html" %}
{% endfor %}
{% endblock %}
original 似乎是生成 ModelForm 的模型实例。顺便说一句,我通常不使用内联 CSS,但不值得为单个规则单独文件。
来源:
- docs.djangoproject.com/en/dev/ref/settings/#app-dirs