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

如何在Django Admin中显示已有Inline对象的__str__,新增仍用表单

Django Admin 实现已有关联对象显示__str__并保留新增表单功能

完全可以实现,下面是一种直接有效的方案:

自定义Inline模板

通过覆盖Django Admin默认的Inline模板,区分已存在的关联对象和新增的空白表单,对已存在对象直接渲染其__str__内容,新增表单保持原有可编辑状态。

步骤1:创建自定义Inline模板

在项目的templates/admin目录下新建custom_inline.html,内容如下:

{% load i18n admin_urls %}
<div class="inline-group" id="{{ inline_admin_formset.formset.prefix }}-group">
  <h2>{{ inline_admin_formset.opts.verbose_name_plural|capfirst }}</h2>
  {{ inline_admin_formset.formset.management_form }}
  {{ inline_admin_formset.formset.non_form_errors }}

  {% for inline_admin_form in inline_admin_formset %}
    <div class="inline-related{% if inline_admin_form.original or inline_admin_form.show_url %} has_original{% endif %}{% if forloop.last %} empty-form last-related{% endif %}" id="{{ inline_admin_formset.formset.prefix }}-{% if not forloop.last %}{{ forloop.counter0 }}{% else %}empty{% endif %}">
      {% if inline_admin_form.original %}
        <!-- 已存在的对象显示__str__内容 -->
        <p>{{ inline_admin_form.original }}</p>
        <!-- 可选:保留删除复选框,允许删除已关联对象 -->
        {{ inline_admin_form.deletion_field.field }}
      {% else %}
        <!-- 新增空白表单正常渲染可编辑字段 -->
        {% if inline_admin_form.form.non_field_errors %}
          {{ inline_admin_form.form.non_field_errors }}
        {% endif %}
        {% for fieldset in inline_admin_form %}
          {% include "admin/includes/fieldset.html" %}
        {% endfor %}
        {% if inline_admin_form.show_url %}
          <p><a href="{% url inline_admin_form.opts|admin_urlname:'change' inline_admin_form.original.pk|admin_urlquote %}">{% translate "View on site" %}</a></p>
        {% endif %}
      {% endif %}
    </div>
  {% endfor %}
</div>

步骤2:在Inline类中指定自定义模板

修改你的Admin配置类,给Inline设置template属性指向刚才创建的模板:

from django.contrib import admin
from .models import 你的父模型, 你的关联子模型

class 关联子模型Inline(admin.TabularInline):
    model = 你的关联子模型
    template = 'admin/custom_inline.html'
    extra = 1  # 控制默认显示的新增空白表单数量

@admin.register(你的父模型)
class 父模型Admin(admin.ModelAdmin):
    inlines = [关联子模型Inline]

效果说明

  • 已存在的关联对象会直接显示其__str__方法返回的内容,不再展示可编辑表单
  • 点击「Add another」按钮仍会弹出空白可编辑表单,支持新增关联对象
  • 模板中保留了删除复选框,若不需要删除功能,可移除{{ inline_admin_form.deletion_field.field }}这一行

内容的提问来源于stack exchange,提问作者Anonymouslemming

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 11:22:51