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

