Django Admin-禁用编辑并删除特定型号的“保存”按钮

时间:2011-12-09 08:10:02

标签: django django-admin

我有一个Django模型,我希望它只是readonly。不允许添加和编辑。

我已将所有字段标记为readonly并在ModelAdmin中覆盖has_add_permission:

class SomeModelAdmin(admin.ModelAdmin):
     def has_add_permission(self, request):
        return False

是否有类似的has_edit_permission?可以禁用哪个删除“保存”和“保存并继续”按钮?并通过简单的“关闭并返回”按钮替换。

Django Documentation仅提及只读字段而不是覆盖编辑权限。

9 个答案:

答案 0 :(得分:16)

对于Django 1.11:

def has_add_permission(self, request, obj=None):
    return False

def changeform_view(self, request, object_id=None, form_url='', extra_context=None):
    extra_context = extra_context or {}
    extra_context['show_save_and_continue'] = False
    extra_context['show_save'] = False
    return super(YourModelAdmin, self).changeform_view(request, object_id, extra_context=extra_context)

答案 1 :(得分:10)

覆盖templates/admin/submit_line.html模板并按下您想要的按钮。您只能将其放在templates/admin/[app_label]/[model]/submit_line.html

中,才能对特定模型执行此操作

要有条件地显示默认提交行或自定义提交行,请覆盖ModelAdmin.change_view,并向extra_context添加布尔值:

class MyModelAdmin(admin.ModelAdmin):
    ...
    def change_view(self, request, object_id, extra_context=None):
        if not request.user.is_superuser:
            extra_context = extra_context or {}
            extra_context['readonly'] = True

        return super(MyModelAdmin, self).change_view(request, object_id, extra_context=extra_context)

答案 2 :(得分:9)

我有同样的问题。我在admin.py

中修复了它
from django.contrib.admin.templatetags.admin_modify import register, submit_row as original_submit_row

@register.inclusion_tag('admin/submit_line.html', takes_context=True)
def submit_row(context):
''' submit buttons context change '''
ctx = original_submit_row(context)
ctx.update({
    'show_save_and_add_another': context.get('show_save_and_add_another',
                                             ctx['show_save_and_add_another']),
    'show_save_and_continue': context.get('show_save_and_continue',
                                          ctx['show_save_and_continue']),
    'show_save': context.get('show_save',
                             ctx['show_save']),
    'show_delete_link': context.get('show_delete_link', ctx['show_delete_link'])
})
return ctx

在MyModelAdmin类中,添加以下函数

@classmethod
def has_add_permission(cls, request):
    ''' remove add and save and add another button '''
    return False

def change_view(self, request, object_id, extra_context=None):
    ''' customize add/edit form '''
    extra_context = extra_context or {}
    extra_context['show_save_and_continue'] = False
    extra_context['show_save'] = False
    return super(MyModelAdmin, self).change_view(request, object_id, extra_context=extra_context)

答案 3 :(得分:8)

使用Django 1.8(Python 3语法)更新了答案。

有三件事要做:
1)扩展管理员更改表单模板,添加if以有条件地禁止提交按钮
2)覆盖admin.ModelAdmin.change_view()并为模板if设置上下文var以读取
3)禁止不受欢迎的POST请求(来自DOM hacking,curl / Postman)

MyProject的/ my_app应用/模板/管理/程序my_app / change_form.html

{% extends "admin/change_form.html" %}
{% load admin_modify %}
{% block submit_buttons_top %}{% if my_editable %}{% submit_row %}{% endif %}{% endblock %}
{% block submit_buttons_bottom %}{% if my_editable %}{% submit_row %}{% endif %}{% endblock %}

MyProject / my_app / admin.py(MyModelAdmin)

def change_view(self, request, object_id, form_url='', extra_context=None):
  obj = MyModel.objects.get(pk=object_id)
  editable = obj.get_status() == 'Active'

  if not editable and request.method == 'POST':
    return HttpResponseForbidden("Cannot change an inactive MyModel")

  more_context = {
    # set a context var telling our customized template to suppress the Save button group
    'my_editable': editable,
  }
  more_context.update(extra_context or {})
  return super().change_view(request, object_id, form_url, more_context)

答案 4 :(得分:5)

我遇到了同样的问题 - 最简单的方法就是包含一些自定义的JS。

在您的admin.py文件中包含

class Media:
    js = ('/static/js/admin.js',)

然后在您的admin.js文件中,包含以下JS。

(function($) {
    $(document).ready(function($) {
         $(".submit-row").hide()
    });
})(django.jQuery);

该行已经消失 - 它也适用于所有版本的Django。

答案 5 :(得分:1)

最简单的方法是在ModelAdmin类中禁用各自的权限。例如,我有一个Cart模式,希望管理员仅查看(列表和详细信息),而我所做的就是向CartAdmin类添加以下功能,以禁止删除,更改和添加

class CartAdmin(admin.ModelAdmin):
    list_display = ['listing']

    def has_add_permission(self, request, obj=None):
        return False

    def has_change_permission(self, request, obj=None):
        return False

    def has_delete_permission(self, request, obj=None):
        return False

三种方法has_add_permission,has_change_permission和has_delete_permission是在管理员中禁用添加按钮,添加表单,编辑表单和删除按钮的方法

这是在禁用了上述权限的管理员中查看记录详细信息时的示例输出

enter image description here

如上图所示,您只有关闭按钮,而详细信息未显示在表单中

答案 6 :(得分:0)

你可以尝试这个包Django Admin View Permission。此包为指定的模型添加view permission并自动处理其他内容。

答案 7 :(得分:0)

基于优秀的answer from @mat_gessel,我的解决方案是:

主要区别在于UX' y:

另外:

  • override change_form.html应用范围,因为read_only是一种非常有用的非侵入式增强功能
  • 定义has_delete_permission(可能不需要OP)
  • 测试request.method != 'GET'以阻止PATCH和朋友(不完全确定是否需要这样做,tbh)

程序my_app / admin.py

from django.core.urlresolvers import reverse
from django.shortcuts import redirect

from django.contrib import admin
from django.contrib import messages


class MyModelAdmin(admin.ModelAdmin):
    # let's assume two fields...
    fields = (field1, field2)

    def changeform_view(self, request, object_id=None, form_url='', extra_context=None):
        if object_id:
            extra_context = extra_context or {}
            extra_context['read_only'] = True

            if request.method != 'GET':
                messages.error(request, "Cannot edit a MyModel object")
                return redirect(
                    reverse('admin:myapp_mymodel_change', args=[object_id])
                )

        return super(MyModelAdmin, self).changeform_view(request, object_id, extra_context=extra_context)

    def has_delete_permission(self, request, obj=None):
        return False

    def get_readonly_fields(self, request, obj=None):
        if obj:
            # display all fields as text, rather than inputs
            return (field1, field2)
        else:
            return []

管理员/ change_form.html

{% extends "admin/change_form.html" %}
{% load admin_modify %}
{# remove the save buttons if read_only is truthy #}
{% block submit_buttons_top %}{% if not read_only %}{% submit_row %}{% endif %}{% endblock %}
{% block submit_buttons_bottom %}{% if not read_only %}{% submit_row %}{% endif %}{% endblock %}

(在Django 1.9上测试:抬头:从那时起一些进口已经移动,例如reverse

答案 8 :(得分:0)

这已经有一段时间了。名称为has_add_permissionhas_change_permissionhas_delete_permission。请参阅django admin documentation以供参考。这也是一个示例:

@admin.register(Object)
class Admin(admin.ModelAdmin):

    def has_add_permission(self, request):
        return False

    def has_change_permission(self, request, obj=None):
        return False

    def has_delete_permission(self, request, obj=None):
        return False