Django Admin特定模型满足条件时隐藏保存类按钮问题求助
解决Django Admin中隐藏保存按钮的问题
针对你遇到的两个需求——隐藏“保存并添加另一个”按钮,以及特定条件下隐藏所有保存按钮,这里提供两种实用的实现方案:
方案一:重写get_submit_buttons(无需自定义模板,推荐)
Django 3.2及以上版本提供了get_submit_buttons方法,能直接在ModelAdmin中控制提交按钮的显示逻辑,不用修改模板,非常简洁:
from django.contrib.admin import ModelAdmin from .models import collection_management_MammalianLine class MammalianLineAdmin(ModelAdmin): # 你的其他ModelAdmin配置(比如list_display、fields等) def get_submit_buttons(self, request, obj=None): # 获取默认的提交按钮列表 buttons = super().get_submit_buttons(request, obj) # 需求1:隐藏“保存并添加另一个”按钮 # 如果只想在修改记录时隐藏,加个判断:if obj is not None buttons = [btn for btn in buttons if btn.name != '_addanother'] # 需求2:特定条件下隐藏所有保存按钮 hide_all = False if obj: # 替换成你的实际判断条件 if not (request.user.is_superuser or request.user.groups.filter(name='Lab Managers').exists()): hide_all = True # 条件满足时返回空列表,彻底隐藏所有保存按钮 if hide_all: return [] return buttons # 可选:给用户添加提示信息,说明无法修改的原因 def changeform_view(self, request, object_id=None, form_url='', extra_context=None): extra_context = extra_context or {} obj = None if object_id: try: obj = self.model.objects.get(pk=object_id) except self.model.DoesNotExist: pass if obj and not (request.user.is_superuser or request.user.groups.filter(name='Lab Managers').exists()): extra_context['warning_msg'] = "您没有权限修改此记录,或当前记录状态不允许编辑。" return super().changeform_view(request, object_id, form_url, extra_context)
细节说明:
- 按钮的
name属性对应:_save是“保存”,_addanother是“保存并添加另一个”,_continue是“保存并继续编辑”,可以针对性过滤某个按钮。 - 如果需要在页面显示提示信息,可以结合Django的消息框架,比如在
changeform_view里加messages.warning(request, "提示内容"),用户打开页面就能看到。
方案二:自定义Admin模板(灵活度更高)
如果你的Django版本较低,或者需要更个性化的按钮样式/提示,可以通过自定义模板实现:
步骤1:在ModelAdmin中传递控制变量
class MammalianLineAdmin(ModelAdmin): # 指定自定义模板路径 change_form_template = 'admin/your_app/mammalianline/change_form.html' def changeform_view(self, request, object_id=None, form_url='', extra_context=None): extra_context = extra_context or {} obj = None if object_id: try: obj = collection_management_MammalianLine.objects.get(pk=object_id) except collection_management_MammalianLine.DoesNotExist: pass # 传递控制按钮显示的变量 extra_context['show_save_and_add_another'] = False # 全局隐藏该按钮 extra_context['hide_all_buttons'] = False if obj: if not (request.user.is_superuser or request.user.groups.filter(name='Lab Managers').exists()): extra_context['hide_all_buttons'] = True return super().changeform_view(request, object_id, form_url, extra_context)
步骤2:创建自定义模板
在你的app目录下创建templates/admin/your_app/mammalianline/change_form.html,内容如下:
{% extends "admin/change_form.html" %} {% load i18n %} {% block submit_row %} {% if hide_all_buttons %} <div class="submit-row"> <p class="warning">{% trans "您无法修改此记录,权限不足或记录状态不允许编辑。" %}</p> </div> {% else %} <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 %} <!-- 通过变量控制“保存并添加另一个”按钮的显示 --> {% if show_save_and_add_another %}<input type="submit" value="{% trans 'Save and add another' %}" name="_addanother">{% endif %} {% if show_delete_link %}<p class="deletelink-box"><a href="{% url opts|admin_urlname:'delete' original.pk|admin_urlquote %}" class="deletelink">{% trans "Delete" %}</a></p>{% endif %} </div> {% endif %} {% endblock %}
细节说明:
- 模板继承自默认的
admin/change_form.html,只重写submit_row块,不会影响其他Admin页面的样式。 - 你可以自由调整提示信息的样式,或者添加额外的操作按钮(如果需要)。
内容的提问来源于stack exchange,提问作者Nicola Zilio
相关产品推荐
相关产品推荐

