Django Admin-禁用特定模型的“添加”操作


147

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

无论如何,对于某些型号,是否禁用“添加$ MODEL”功能?

我想/admin/appname/modelname/add/给出一个404(或适当的“ goaway”错误消息),我不希望显示“ Add $ MODELNAME”按钮/admin/appname/modelname

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


仅供参考:django admin中的“ actions”是在变更列表视图中应用于列表中所有选中行的下拉列表。
蒂姆·迪金斯

1
相关(但不同的)问题:stackoverflow.com/questions/1721037/...
user9876

Answers:


342

这很简单,只需has_add_permission在您的Admin类中重载方法,如下所示:

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

7
这对我没有用。“添加模型”按钮仍显示在模型的更改列表页面上。
塞林2012年

MyAdmin在这里是什么?
user5319825 2013年

1
不要忘记像这样注册MyAdmin:admin.site.register(MyModel, MyModelAdmin)将全部添加到admin.py模型的app文件夹中。
djangonaut

这正是我如此热爱Python和Django的原因。简单。很棒。谢谢!
dxhans5

2
适用于Django 1.11。无需obj参数。
fjsj

9

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

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

如果您以Admin身份登录,则无论如何,您将获得一切

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

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


7

我认为这将对您有所帮助..下面的代码必须在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。并且还将删除超级用户的添加和删除按钮。正是我所需要的。
Erik Kalkoken

2

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

# 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是模型中定义的字段

如果以以下形式定义:

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

也可以看看


是的,base_fields而且declared_fields是最重要的发现,我从这个案例的教训。
CK

0

这是一个过于延迟的答案;只需将其发布,就好像有人在寻找相同的解决方案一样。

在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”起到了神奇的作用。谢谢。


4
这不会阻止“添加”按钮的出现。
Flimm

此解决方案将仅使表单上的标题和权重字段禁用。这不会阻止创建新的MyModelAdmin对象,这是我认为OP所要求的。
dxhans5
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.