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

在Django Admin中添加自定义按钮跳转至其他模型的技术问询

嘿,我来帮你搞定这两个Django Admin的定制问题!

一、实现自定义按钮跳转至其他模型

这里分两种常见场景,你可以根据需求选择:

场景1:直接跳转(不保存当前表单)

如果不需要保存当前页面的内容,直接跳转到目标模型的后台页面,最简单的方式是在submit_line.html里添加一个带跳转链接的按钮:

{% load i18n admin_urls %}
<div class="submit-row">
    {% if show_save %}<input type="submit" value="{% trans 'Save' %}" class="default" name="_save">{% endif %}
    {% if show_save_and_continue %}<input type="submit" value="{% trans 'Save and continue editing' %}" name="_continue">{% endif %}
    <!-- 自定义跳转按钮 -->
    <a href="{% url 'admin:appname_othermodel_changelist' %}" class="button">跳转到其他模型列表</a>
    <!-- 原有按钮保留 -->
    {% if show_save_and_add_another %}<input type="submit" value="{% trans 'Save and add another' %}" name="_addanother">{% endif %}
    {% if show_delete_link %}<a href="{% url opts|admin_urlname:'delete' original.pk|admin_urlquote %}" class="deletelink">{% trans 'Delete' %}</a>{% endif %}
</div>

这里的admin:appname_othermodel_changelist是Django Admin自动生成的URL别名,格式为admin:你的应用名_目标模型名小写_changelist;如果要跳转到目标模型的添加页面,把_changelist换成_add即可。

场景2:保存当前表单后跳转

如果需要先保存当前表单数据,再跳转到目标模型,需要两步操作:

1. 修改submit_line.html,添加带标识的提交按钮

{% load i18n admin_urls %}
<div class="submit-row">
    {% if show_save %}<input type="submit" value="{% trans 'Save' %}" class="default" name="_save">{% endif %}
    {% if show_save_and_continue %}<input type="submit" value="{% trans 'Save and continue editing' %}" name="_continue">{% endif %}
    <!-- 自定义保存并跳转按钮 -->
    <input type="submit" value="保存并跳转到其他模型" class="button" name="_save_and_jump">
    {% if show_save_and_add_another %}<input type="submit" value="{% trans 'Save and add another' %}" name="_addanother">{% endif %}
    {% if show_delete_link %}<a href="{% url opts|admin_urlname:'delete' original.pk|admin_urlquote %}" class="deletelink">{% trans 'Delete' %}</a>{% endif %}
</div>

2. 在ModelAdmin的changeform_view中处理按钮提交

在你的ModelAdmin类里重写changeform_view方法,判断是否点击了自定义按钮,完成保存后重定向到目标模型:

from django.shortcuts import redirect
from django.urls import reverse

class YourModelAdmin(admin.ModelAdmin):
    # 其他配置项...

    def changeform_view(self, request, object_id=None, form_url='', extra_context=None):
        # 处理自定义按钮的提交逻辑
        if request.method == 'POST' and '_save_and_jump' in request.POST:
            # 调用父类方法完成数据保存
            response = super().changeform_view(request, object_id, form_url, extra_context)
            # 确认保存成功(状态码302表示保存后默认重定向)
            if response.status_code == 302:
                # 生成目标模型的后台列表URL
                target_url = reverse('admin:appname_othermodel_changelist')
                return redirect(target_url)
            return response
        # 其他情况走默认逻辑
        return super().changeform_view(request, object_id, form_url, extra_context)
二、重写submit_line.html中的JavaScript函数(比如_save)

Django Admin的submit_line.html里的_save是绑定在保存按钮上的JS函数,要重写它,你可以这样做:

1. 创建自定义submit_line模板

在项目的templates/admin目录下创建submit_line_custom.html(或者直接修改你已有的自定义submit_line.html),在模板末尾添加JS代码覆盖原函数:

{% load i18n admin_urls %}
<div class="submit-row">
    <!-- 原有按钮代码保持不变 -->
    {% if show_save %}<input type="submit" value="{% trans 'Save' %}" class="default" name="_save" onclick="_save()">{% endif %}
    {% if show_save_and_continue %}<input type="submit" value="{% trans 'Save and continue editing' %}" name="_continue">{% endif %}
    <!-- 你的自定义按钮 -->
    {% if show_save_and_add_another %}<input type="submit" value="{% trans 'Save and add another' %}" name="_addanother">{% endif %}
    {% if show_delete_link %}<a href="{% url opts|admin_urlname:'delete' original.pk|admin_urlquote %}" class="deletelink">{% trans 'Delete' %}</a>{% endif %}
</div>

<!-- 重写_save函数 -->
<script>
// 覆盖原有的_save函数
function _save() {
    // 这里写你的自定义逻辑,比如添加日志、修改表单数据等
    console.log('触发自定义保存逻辑');
    // 执行默认提交行为(如果需要保留原有保存功能)
    const form = document.getElementById('change-form'); // Django Admin表单默认ID是change-form
    form.submit();
}
</script>

2. 绑定到特定ModelAdmin(可选)

如果只需要给某个ModelAdmin用这个自定义模板,可以在ModelAdmin里指定change_form_template:

class YourModelAdmin(admin.ModelAdmin):
    change_form_template = 'admin/your_app/your_model/change_form.html'

然后在这个change_form.html里继承默认模板,替换submit_line区块:

{% extends "admin/change_form.html" %}

{% block submit_buttons_bottom %}
    {% include "admin/submit_line_custom.html" %}
{% endblock %}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 11:29:51