You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何调整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字段所在组之后)

  1. 修改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')
            }),
        )
    
  2. 创建自定义模板
    在项目的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 20:22:44