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

我有一个姜戈网站,有很多模型和形式。我有许多自定义的表单和格式集、 inlineformset、自定义验证和自定义查询集。因此,add model 操作依赖于需要其他东西的表单,django 管理中的“ add model”来自自定义查询集中的500。

是否有任何办法禁用’添加 $MODEL’功能的某些型号?

我希望 /admin/appname/modelname/add/给出一个404(或合适的‘ go away’错误消息) ,我不希望‘ Add $MODELNAME’按钮在 /admin/appname/modelname视图中。

Django admin 提供了一种禁用 admin 操作( http://docs.djangoproject.com/en/dev/ref/contrib/admin/actions/#disabling-actions )的方法,但是这个模型的唯一操作是“ delete _ select”。也就是说,管理操作只能作用于现有的模型。有什么姜戈式的方法吗?

65778 次浏览

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

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

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

  1. 创建(又名添加)
  2. 改变
  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)

在这里,“ readonly _ fields”起到了神奇的作用。谢谢。

我觉得这个能帮到你。 下面的代码必须在 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

从另一个答案复制代码

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

参见