我正在开发一个有两个管理后端的Django应用程序.一个用于"普通"用户的日常使用,默认用于更高级的任务和开发人员.
该应用程序使用一些自定义权限,但没有默认权限.所以我目前正在寻找一种方法来删除默认权限,或者至少是一种在没有大的修改的情况下将它们隐藏在"每日"管理员后端的方法.
BFi*_*Fil 18
更新:Django 1.7支持自定义默认权限
原始答案
以下内容适用于1.7版之前的Django
这是auth contrib应用程序的标准功能.
它处理post_syncdb信号并为每个模型创建权限(标准3:添加,更改,删除以及任何自定义权限); 它们存储在数据库的auth_permission表中.
因此,每次运行syncdb管理命令时都会创建它们
你有一些选择.没有什么是优雅的,但你可以考虑:
删除auth contrib应用程序并提供您自己的身份验证后端.
后果 - >您将失去在auth用户模型之上构建的管理员和其他自定义应用程序,但如果您的应用程序是高度自定义的,那么可以为您提供一个选项
覆盖auth应用程序内的post_syncdb信号的行为(在\ django\contrib\auth\management__init __.py文件中)
后果 - >请注意,如果没有基本权限,Django管理界面将无法工作(也可能是其他事情).
删除auth_permission表中每个模型的基本权限(添加,更改,删除)(手动,使用脚本或其他).
后果 - >您将再次丢失管理员,并且每次运行syncdb时都需要删除它们.
构建您自己的权限应用程序/系统(使用您自己的装饰器,中间件等)或扩展现有的应用程序/系统.
后果 - >无,如果你建好 - 这是我认为最干净的解决方案之一.
最后一个考虑因素:更改contrib应用程序或Django框架本身从来都不是一件好事:如果你需要升级到更新版本的Django,你可能会遇到麻烦.
所以,如果你想尽可能干净,可以考虑滚动你自己的权限系统,或者扩展标准权限(django-guardian是django权限扩展的一个很好的例子).它不会花费太多精力,您可以按照适合自己的方式构建它,克服标准django权限系统的限制.如果你做得很好,你也可以考虑开源它以使其他人能够使用/改进你的解决方案=)
pmd*_*row 16
我在这个问题上挣扎了一段时间,我想我已经想出了一个干净的解决方案.以下是隐藏Django的auth应用程序权限的方法:
from django.contrib import admin
from django.utils.translation import ugettext_lazy as _
from django import forms
from django.contrib.auth.models import Permission
class MyGroupAdminForm(forms.ModelForm):
class Meta:
model = MyGroup
permissions = forms.ModelMultipleChoiceField(
Permission.objects.exclude(content_type__app_label='auth'),
widget=admin.widgets.FilteredSelectMultiple(_('permissions'), False))
class MyGroupAdmin(admin.ModelAdmin):
form = MyGroupAdminForm
search_fields = ('name',)
ordering = ('name',)
admin.site.unregister(Group)
admin.site.register(MyGroup, MyGroupAdmin)
Run Code Online (Sandbox Code Playgroud)
当然,可以轻松修改它以隐藏您想要的任何权限.如果这对您有用,请告诉我.
ode*_*den 11
Django 1.7中引入的新功能是定义默认权限的能力.如文档中所述,如果将其设置为空,则不会创建任何默认权限.
一个工作的例子是:
class Blar1(models.Model):
id = models.AutoField(primary_key=True)
name = models.CharField(max_length=255, unique = True, blank = False, null = False, verbose_name= "Name")
class Meta:
default_permissions = ()
Run Code Online (Sandbox Code Playgroud)
小智 6
ShadowCloud给了一个很好的破坏.这是实现目标的简单方法.
在admin.py中添加以下行:
from django.contrib.auth.models import Permission
admin.site.register(Permission)
Run Code Online (Sandbox Code Playgroud)
您现在可以在管理员中添加/更改/删除权限.删除未使用的,当你有你想要的,然后返回并从admin.py中删除这两行.
正如其他人所提到的,后续的syncdb会把所有东西都放回去.
| 归档时间: |
|
| 查看次数: |
14386 次 |
| 最近记录: |