Django自定义Admin视图点击按钮后消息不显示问题求助
修复Django Admin自定义视图消息不显示的问题
1. 修正自定义视图的响应逻辑
自定义视图my_view必须返回重定向到模型修改页面的响应——Django消息框架依赖会话存储消息,只有重定向到下一个请求,消息才会被保留并渲染。修改MyAdminSite中的my_view方法:
from django.shortcuts import redirect from django.contrib.admin.utils import quote def my_view(self, request, pk): # 执行你的业务逻辑 messages.info(request, 'some message') # 重定向回模型的修改页面 return redirect( f'{self.name}:appname_modelname_change', quote(pk) )
注:appname_modelname_change是Django Admin自动生成的修改页URL名称,格式为[admin_site_name]:[app_label]_[model_name]_change,需替换为你实际的应用、模型名称。
2. 统一URL名称与模板引用
你的URL定义中name为appname_modelname_view,但模板里用的是opts|admin_urlname:'myview',两者不匹配会导致URL解析错误,二选一修改即可:
方案一:修改URL的name参数
将URL名称改为myview,匹配模板中的引用:
def get_urls(self): from django.urls import path urls = super().get_urls() urls += [ path('appname/modelname/<int:pk>', self.admin_view(self.my_view), name='myview'), ] return urls
方案二:修改模板中的URL引用
直接使用自定义URL的名称,指定你的AdminSite实例名(此处为my_admin):
<a href="{% url 'my_admin:appname_modelname_view' original.pk %}" class="someclass">Invoke</a>
3. 移除模板中重复的消息渲染(可选)
原生admin/change_form.html已经包含消息渲染逻辑,你手动添加的<ul class="messages">会导致重复显示,建议删除这段代码,直接继承原模板的消息展示:
{% extends "admin/change_form.html" %} {% load i18n admin_urls %} {% block object-tools-items %} <li> <a href="{% url opts|admin_urlname:'myview' original.pk %}" class="someclass">Invoke</a> </li> <li> <a href="{% url opts|admin_urlname:'history' original.pk|admin_urlquote %}" class="historylink">{% translate "History" %}</a> </li> {% if has_absolute_url %} <li> <a href="{% url 'admin:view_on_site' content_type_id original.pk %}" class="viewsitelink">{% translate "View on site" %}</a> </li> {% endif %} {% endblock %}
验证
重启Django服务后,进入模型修改页点击"Invoke"按钮,页面会重定向回修改页,顶部将正常显示你设置的info消息。
内容的提问来源于stack exchange,提问作者Musical_Ant
相关产品推荐
相关产品推荐

