如何在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
相关产品推荐
相关产品推荐

