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

时间:2010-11-10 11:18:03

标签: python django django-admin

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

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

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

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

5 个答案:

答案 0 :(得分:308)

这很容易,只需在has_add_permission类中重载Admin方法就像这样:

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

答案 1 :(得分:7)

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

  1. 创建(又名添加)
  2. 更改
  3. 删除
  4. 如果您以管理员身份登录,无论如何都可以一切

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

    然后,作为该组成员的任何登录用户都没有“创建”权限,屏幕上将显示与其无关的任何内容。

答案 2 :(得分:1)

我认为这会对您有所帮助。 下面的代码必须在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

答案 3 :(得分:1)

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

# 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']

see also

答案 4 :(得分: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”具有魔力。感谢。