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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 07:06:38