ChatGPT解决这个技术问题 Extra ChatGPT

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 风格的方法来做到这一点?

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

D
Dadep

这很简单,只需在 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 参数。
A
Ajibola L'Don Jibson Olayanju

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

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

创建(又名添加)更改删除

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

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

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


C
C.K.

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

# 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


是的,base_fieldsdeclared_fields 是我从这个案例中学到的最重要的发现。
M
Mohammad

这是一个延迟太多的答案;只是发布这个好像有人正在寻找相同的解决方案。

在 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 所要求的。