Python Django Admin-禁用';添加';针对特定模型的操作

Python Django Admin-禁用';添加';针对特定模型的操作,python,django,django-admin,Python,Django,Django Admin,我有一个django网站,有很多模型和表单。我有许多自定义表单和表单集、InlineFormset、自定义验证和自定义查询集。因此,addmodel操作取决于需要其他东西的表单,而django管理中的“addmodel”是通过自定义查询集的500完成的 对于某些型号,是否仍有禁用“添加$MODEL”功能的方法 我希望/admin/appname/modelname/add/给出404(或适当的“走开”错误消息),我不希望“add$modelname”按钮处于/admin/appname/mode

我有一个django网站,有很多模型和表单。我有许多自定义表单和表单集、InlineFormset、自定义验证和自定义查询集。因此,addmodel操作取决于需要其他东西的表单,而django管理中的“addmodel”是通过自定义查询集的500完成的

对于某些型号,是否仍有禁用“添加$MODEL”功能的方法

我希望
/admin/appname/modelname/add/
给出404(或适当的“走开”错误消息),我不希望“add$modelname”按钮处于
/admin/appname/modelname
视图中


Django admin提供了一种禁用管理操作的方法(http://docs.djangoproject.com/en/dev/ref/contrib/admin/actions/#disabling-操作)但是,此模型的唯一操作是“删除选定项”。i、 e.管理操作仅作用于现有模型。有什么django风格的方法可以做到这一点吗?

这很简单,只需重载
Admin
类中有\u add\u权限
方法,如下所示:

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

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

  • 创建(又名添加)
  • 改变
  • 删除
  • 如果您以管理员身份登录,则无论发生什么情况,您都会获得所有信息

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


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

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

    在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)
    

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

    我想这会对你有所帮助。。 下面的代码必须在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
    
    只需从另一个答案中复制代码即可 管理中的
    #
    #使相关字段无法添加
    def get_表单(自我、请求、obj=None、**kwargs):
    form=super().get_form(请求、对象、**kwargs)
    form.base\u fields['service'].widget.can\u add\u related=False
    报税表
    
    在我的例子中,我使用内联
    #在内联表单集中,例如admin.TabularInline
    #禁用所有
    def get_formset(self、request、obj=None、**kwargs):
    formset=super().get_formset(请求、对象、**kwargs)
    service=formset.form.base_字段['service']
    service.widget.can\u add\u related=service.widget.can\u change\u related=service.widget.can\u delete\u related=False
    返回表单集
    
    service=formset.form.base_字段['service']
    基本字段
    是模型中定义的字段

    如果在表格中定义,请使用:

    product=formset.form.declared_字段['product']


    django admin中的“操作”是在changelist视图中应用于列表中所有选中行的下拉列表。相关(但不同)问题:这对我不起作用。“添加模型”按钮仍然显示在模型的变更列表页面上。这里的MyAdmin是什么?别忘了注册MyAdmin,比如:
    admin.site.register(MyModel,MyModelAdmin)
    将所有内容添加到模型应用文件夹的
    admin.py
    。这正是我如此喜欢Python和Django的原因。简单。工作得很好。非常感谢。在Django 1.11工作。不需要
    obj
    参数。这不会阻止“添加”按钮出现。此解决方案只会在表单上禁用标题和权重字段。它不会阻止创建一个新的MyModelAdmin对象,这是我相信OP所要求的。是的,
    base_字段
    declared_字段
    是我从这个案例中学到的最重要的发现。这适用于2.2。还将删除超级用户的“添加”和“删除”按钮。正是我需要的。谢谢!在3.2中工作