代码之家  ›  专栏  ›  技术社区  ›  Amandasaurus

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

  •  133
  • Amandasaurus  · 技术社区  · 14 年前

    我有一个django网站,有很多模型和表单。我有许多自定义表单和表单集、内联表单集、自定义验证和自定义查询集。因此,add model操作依赖于需要其他东西的表单,django管理中的“add model”通过一个定制的queryset得到500。

    我想要 /admin/appname/modelname/add/ 要发出404(或适当的“走开”错误消息),我不希望“添加$MODELNAME”按钮处于打开状态 /admin/appname/modelname 查看。

    Django admin提供了一种禁用管理操作的方法(http://docs.djangoproject.com/en/dev/ref/contrib/admin/actions/#禁用操作),但是此模型的唯一操作是“删除选定项”。即管理行为只对现有模型起作用。有什么django风格的方法吗?

    4 回复  |  直到 14 年前
        1
  •  325
  •   Dadep    6 年前

    很容易,只是超载 has_add_permission 你的方法 Admin

    class MyAdmin(admin.ModelAdmin):
         def has_add_permission(self, request, obj=None):
            return False
    
        2
  •  8
  •   Richard Cooke    11 年前

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

    1. 改变
    2. 删除

    如果您以管理员身份登录,则 不管怎样。

    但是如果你创造了一个新的 用户组 打电话 然后,您只能为所有模型分配更改和删除权限。

        3
  •  5
  •   Sandeep Prasad Kushwaha    5 年前

    我想这对你有帮助。。 下面的代码必须在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
    
        4
  •  1
  •   C.K.    5 年前

    # 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

        5
  •  0
  •   Mohammad    6 年前

    这是一个太多的延迟回答;只是张贴这个似乎有人正在寻找相同的解决方案。

    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)
    

    在这里,“只读字段”起到了神奇的作用。谢谢。