【问题标题】:Django Admin - Disable the 'Add' action for a specific modelDjango Admin - 禁用特定模型的“添加”操作
【发布时间】:2011-05-07 19:57:06
【问题描述】:

我有一个 django 网站,里面有很多模型和表格。我有许多自定义表单和表单集以及内联表单集以及自定义验证和自定义查询集。因此,添加模型操作取决于需要其他东西的表单,并且 django 管理员中的“添加模型”通过自定义查询集中的 500。

是否可以禁用某些型号的“添加 $MODEL”功能?

我希望 /admin/appname/modelname/add/ 提供 404(或合适的“离开”错误消息),我不希望在 /admin/appname/modelname 视图上显示“添加 $MODELNAME”按钮。

Django admin 提供了一种禁用管理操作的方法 (http://docs.djangoproject.com/en/dev/ref/contrib/admin/actions/#disabling-actions) 但是此模型的唯一操作是“delete_selected” '。即管理员操作仅对现有模型起作用。有没有一些 django 风格的方法来做到这一点?

【问题讨论】:

  • 仅供参考:django admin 中的“操作”是在更改列表视图中应用于列表中任何选中行的下拉列表。
  • 相关(但不同)问题:stackoverflow.com/questions/1721037/…

标签: python django django-admin


【解决方案1】:

这很简单,只需像这样在 Admin 类中重载 has_add_permission 方法:

class MyAdmin(admin.ModelAdmin):
     def has_add_permission(self, request, obj=None):
        return False

【讨论】:

  • 这对我不起作用。 “添加模型”按钮仍显示在模型的更改列表页面上。
  • 这里的 MyAdmin 是什么?
  • 别忘了也注册 MyAdmin 喜欢:admin.site.register(MyModel, MyModelAdmin) 全部添加到模型应用文件夹的admin.py 中。
  • 这正是我如此热爱 Python 和 Django 的原因。简单的。工作得很好。谢谢!
  • 在 Django 1.11 中工作。不需要obj 参数。
【解决方案2】:

我想这会对你有所帮助.. 以下代码必须在 admin.py 文件中

@admin.register(Author)
class AuthorAdmin(admin.ModelAdmin):
    list_display = ('name', )
    list_filter = ('name', )
    search_fields = ('name', )
    list_per_page = 20

    # This will help you to disbale add functionality
    def has_add_permission(self, request):
        return False

    # This will help you to disable delete functionaliyt
    def has_delete_permission(self, request, obj=None):
        return False

除以上内容外

    # This will help you to disable change functionality
    def has_change_permission(self, request, obj=None):
        return False

【讨论】:

  • 这适用于 2.2。并且还将删除超级用户的添加和删除按钮。正是我需要的。
  • 谢谢!在 3.2 中工作
【解决方案3】:

默认情况下,syncdb 为每个模型创建 3 个安全权限:

  1. 创建(又名添加)
  2. 改变
  3. 删除

如果您以管理员身份登录,那么无论如何您都会获得一切

但是,如果您创建一个名为 “常规访问” (例如) 的新 用户组,那么您只能分配 CHANGE 和 DELETE您所有模型的权限。

那么任何属于该组成员的登录用户都将没有“创建”权限,与它相关的任何内容都不会显示在屏幕上。

【讨论】:

    【解决方案4】:

    只需复制另一个答案的代码

    # In admin
    # make the related field can't be added
        def get_form(self, request, obj=None, **kwargs):
            form = super().get_form(request, obj, **kwargs)
            form.base_fields['service'].widget.can_add_related = False
            return form
    

    就我而言,我使用内联

    # In inline formset e.g. admin.TabularInline
    # disable all
        def get_formset(self, request, obj=None, **kwargs):
            formset = super().get_formset(request, obj, **kwargs)
            service = formset.form.base_fields['service']
            service.widget.can_add_related = service.widget.can_change_related = service.widget.can_delete_related = False
            return formset
    

    service = formset.form.base_fields['service'] base_fields是model中定义的字段

    如果在表单中定义,则使用:

    product = formset.form.declared_fields['product']

    see also

    【讨论】:

    • 是的,base_fieldsdeclared_fields 是我从这个案例中学到的最重要的发现。
    【解决方案5】:

    这是一个延迟太多的答案;就像任何人都在寻找相同的解决方案一样发布此内容。

    在 admin.py 文件中,您可以执行以下操作:

    class MyModelForm(forms.ModelForm):
    
    class Meta:
        model = MyModel
        fields = '__all__'
    
    
    class MyModelAdmin(admin.ModelAdmin):
        form = QuestionTrackAdminForm
        list_display = ['title', 'weight']
        readonly_fields = ['title', 'weight']
    
    admin.site.register(MyModel, MyModelAdmin)
    

    在这里,“readonly_fields”发挥了作用。谢谢。

    【讨论】:

    • 这不会阻止“添加”按钮的出现。
    • 此解决方案只会在表单上禁用标题和重量字段。它不会阻止创建新的 MyModelAdmin 对象,我相信这是 OP 所要求的。
    猜你喜欢
    • 1970-01-01
    • 2020-09-14
    • 2016-06-25
    • 2021-12-12
    • 2012-01-16
    • 2013-03-21
    • 1970-01-01
    • 1970-01-01
    • 2014-09-04
    相关资源
    最近更新 更多