Django代理模型权限不会出现

chi*_*sky 10 django django-models django-admin django-south python-2.7

我为我的应用程序扩展了Django管理站点,允许非员工/超级用户访问.这工作得很好.

我为现有模型创建了一个代理模型,并将其注册到我的管理站点,但是,对于非员工用户,它不会出现.从我阅读的文档中,我的理解是代理模型获得了自己的权限.我检查过,这些没有出现在可用权限列表中.

这是我的代码,以防它有用:

正常模型

class Engagement(models.Model):
    eng_type = models.CharField(max_length=5)
    environment = models.CharField(max_length=8)    
    is_scoped = models.BooleanField()    

    class Meta:
        ordering = ['eng_type', 'environment']
        app_label = 'myapp'
Run Code Online (Sandbox Code Playgroud)

代理模型

class NewRequests(Engagement):
    class Meta:
        proxy = True
        app_label = 'myapp'
        verbose_name = 'New Request'
        verbose_name_plural = 'New Requests'
Run Code Online (Sandbox Code Playgroud)

模特管理员

class NewRequestsAdmin(ModelAdmin):
pass

def queryset(self, request):
    return self.model.objects.filter(is_scoped=0)
Run Code Online (Sandbox Code Playgroud)

自定义管理员注册

myapps_admin_site.register(NewRequests, NewRequestsAdmin)
Run Code Online (Sandbox Code Playgroud)

我一直在和南方管理我的数据库.根据这篇文章,您必须按照它指向用户的说明稍微篡改它.这是一次失败.我的数据库中没有很多信息,因此我取消注释南并运行常规syncdb以排除South.不幸的是,这仍然没有用,我不知所措.任何帮助表示赞赏.

编辑

这是在Django 1.4上

chi*_*sky 7

事实证明我没有做错任何事.我正在寻找权限

myapp | New Request | Can add new request

权限属于父模型.

myapp | engagement | Can add new request


Bru*_*oão 6

有一个解决方法,你可以在这里看到它:https : //gist.github.com/magopian/7543724

它可能因您的 Django 版本而异,但原理是相同的。

用 Django 1.10.1 测试

# -*- coding: utf-8 -*-

"""Add permissions for proxy model.
This is needed because of the bug https://code.djangoproject.com/ticket/11154
in Django (as of 1.6, it's not fixed).
When a permission is created for a proxy model, it actually creates if for it's
base model app_label (eg: for "article" instead of "about", for the About proxy
model).
What we need, however, is that the permission be created for the proxy model
itself, in order to have the proper entries displayed in the admin.
"""

from __future__ import unicode_literals, absolute_import, division

import sys

from django.contrib.auth.management import _get_all_permissions
from django.contrib.auth.models import Permission
from django.contrib.contenttypes.models import ContentType
from django.core.management.base import BaseCommand
from django.apps import apps
from django.utils.encoding import smart_text

class Command(BaseCommand):
    help = "Fix permissions for proxy models."

    def handle(self, *args, **options):
        for model in apps.get_models():
            opts = model._meta
            ctype, created = ContentType.objects.get_or_create(
                app_label=opts.app_label,
                model=opts.object_name.lower(),
                defaults={'name': smart_text(opts.verbose_name_raw)})

            for codename, name in _get_all_permissions(opts):
                p, created = Permission.objects.get_or_create(
                    codename=codename,
                    content_type=ctype,
                    defaults={'name': name})
                if created:
                    sys.stdout.write('Adding permission {}\n'.format(p))
Run Code Online (Sandbox Code Playgroud)

如何使用

  • 创建目录 /myproject/myapp/management/commands
  • 创建文件 /myproject/myapp/management/__init__.py
  • 创建文件 /myproject/myapp/management/commands/__init__.py
  • 将上面的代码保存到 /myproject/myapp/management/commands/fix_permissions.py
  • /manage.py fix_permissions

  • @FelixSFD 感谢您的帮助。现在好多了,也很有帮助。 (2认同)

mrt*_*rts 6

这在 Django 2.2 中得到修复,引用发行说明

现在使用代理模型的内容类型而不是具体模型的内容类型创建代理模型的权限。运行迁移时,迁移将更新现有权限。

文档

代理模型的工作方式与具体模型完全相同。权限是使用代理模型自己的内容类型创建的。代理模型不继承它们子类化的具体模型的权限。