如何调整Django Admin中Inline模块的显示位置?
Django Admin 调整Inline模块显示位置的实现方法
要把Inline模块移动到指定字段旁或字段区域下方,需要通过自定义Admin模板来实现,以下是具体步骤:
一、准备工作
先修正你代码中的拼写错误SpekaerSNSInline为SpeakerSNSInline,基础代码如下:
from django.contrib import admin from .models import Speaker, SpeakerSNS class SpeakerSNSInline(admin.TabularInline): model = SpeakerSNS extra = 1 # 控制默认显示的空表单数量 class SpeakerAdmin(admin.ModelAdmin): inlines = [SpeakerSNSInline] list_display = ('id', 'name', 'display_sns_info', 'affiliation', 'speaker_image', 'order', 'pub_start_date', 'pub_end_date', 'created_at', 'updated_at')
二、移动到指定字段区域下方(如name字段所在组之后)
修改Admin类,指定自定义模板
在SpeakerAdmin中添加模板配置,同时用fieldsets对字段分组,方便定位:class SpeakerAdmin(admin.ModelAdmin): # ... 原有代码 change_form_template = 'admin/speaker_change_form.html' fieldsets = ( ('基本信息', { 'fields': ('name', 'affiliation', 'speaker_image') }), ('其他配置', { 'fields': ('order', 'pub_start_date', 'pub_end_date') }), )创建自定义模板
在项目的templates/admin/目录下创建speaker_change_form.html,继承默认的admin修改表单模板,在目标字段组后渲染Inline:{% extends "admin/change_form.html" %} {% load i18n admin_urls static admin_modify %} {% block field_sets %} {% for fieldset in adminform %} {% include "admin/includes/fieldset.html" %} <!-- 在第一个字段组(包含name字段)之后渲染SpeakerSNSInline --> {% if forloop.first %} {% for inline_admin_formset in inline_admin_formsets %} {% if inline_admin_formset.opts.model == 'yourapp.speakersns' %} {% include inline_admin_formset.opts.template %} {% endif %} {% endfor %} {% endif %} {% endfor %} {% endblock %}注意:将
yourapp替换为你的实际app名称,比如SpeakerSNS模型所在的app叫speakers,就写speakers.speakersns。
三、移动到指定字段旁(如name字段下方)
如果要精确把Inline放在name字段旁边,需要修改模板中字段行的渲染逻辑:
修改speaker_change_form.html内容如下:
{% extends "admin/change_form.html" %} {% load i18n admin_urls static admin_modify %} {% block field_sets %} {% for fieldset in adminform %} <fieldset class="module aligned {{ fieldset.classes }}"> {% if fieldset.name %}<h2>{{ fieldset.name }}</h2>{% endif %} {% if fieldset.description %} <div class="description">{{ fieldset.description|safe }}</div> {% endif %} {% for line in fieldset %} <div class="form-row{% if line.fields|length_is:'1' and line.errors %} errors{% endif %}{% if not line.has_visible_field %} hidden{% endif %}{% for field in line %}{% if field.field.name %} field-{{ field.field.name }}{% endif %}{% endfor %}"> {% if line.fields|length_is:'1' %} {{ line.errors }} {% endif %} {% for field in line %} <div{% if not line.fields|length_is:'1' %} class="field-box{% if field.field.name %} field-{{ field.field.name }}{% endif %}{% if not field.is_readonly and field.errors %} errors{% endif %}{% if field.field.is_hidden %} hidden{% endif %}"{% elif field.is_checkbox %} class="checkbox-row"{% endif %}> {% if not line.fields|length_is:'1' and not field.is_readonly %} {{ field.errors }} {% endif %} {% if field.is_checkbox %} {{ field.field }}{{ field.label_tag }} {% else %} {{ field.label_tag }} {% if field.is_readonly %} <div class="readonly">{{ field.contents }}</div> {% else %} {{ field.field }} {% endif %} {% endif %} {% if field.field.help_text %} <div class="help">{{ field.field.help_text|safe }}</div> {% endif %} <!-- 匹配到name字段时,插入Inline模块 --> {% if field.field.name == 'name' %} <div class="inline-module" style="margin-top:16px;"> {% for inline_admin_formset in inline_admin_formsets %} {% if inline_admin_formset.opts.model == 'yourapp.speakersns' %} {% include inline_admin_formset.opts.template %} {% endif %} {% endfor %} </div> {% endif %} </div> {% endfor %} </div> {% endfor %} </fieldset> {% endfor %} {% endblock %}
可以通过添加style属性调整Inline和字段的间距,优化布局。
四、注意事项
- 确保模板路径正确,需在
settings.py的TEMPLATES配置中添加模板目录 - 替换模板中的
yourapp.speakersns为实际的app和模型名称(小写) - 无论用
TabularInline还是StackedInline,上述模板逻辑均适用
内容的提问来源于stack exchange,提问作者dudu
相关产品推荐
相关产品推荐

