sla*_*art 10 django django-signals django-migrations
我正在为我的项目进行某种重构,我依赖于django django.contrib.auth.models.Permission模型.到目前为止,我使用post_save信号为每个新用户定义权限,因此在创建用户时,我使用user.user_permissions.add(the_permission)它分配权限,这非常有效.
现在我想使用该django.contrib.auth.models.Group模型来区分用户应具有的权限.
这是我的代码:
from django.apps import AppConfig
from django.db.models.signals import post_migrate
from django.contrib.auth.models import Group, Permission
def create_group(name, permissions):
group = Group.objects.create(name=name)
[group.permissions.add(permission) for permission in permissions]
def define_company_groups(sender, **kwargs):
permissions = [
Permission.objects.get(codename='add_mymodel'),
Permission.objects.get(codename='change_mymodel'),
]
create_group('managers', permissions)
class MyAppConfig(AppConfig):
name = 'players'
verbose_name = 'The players app'
def ready(self):
post_migrate.connect(define_company_groups, sender=self)
Run Code Online (Sandbox Code Playgroud)
在定义了这段代码之后,我希望在调用之后./manage.py migrate应该触发这个处理程序.但它没有发生,我得到的只是:
Running post-migrate handlers for application players
Adding permission 'players | mymodel | Can add mymodel'
Adding permission 'companies | company | Can change mymodel'
Adding permission 'companies | company | Can delete company'
Run Code Online (Sandbox Code Playgroud)
我发现这篇https://groups.google.com/forum/#!topic/django-developers/8MdaWtJp4VQ文章,他们说我应该在一个名为management.py(既不包括django.contrib.auth.models.Permission文件中的代码)的文件中定义我的post_migrate处理程序,但不是作品.
最后,这是我的问题:我应该将此代码放在我的自定义post_migrate信号中?
提前致谢.
在Django文档建议连接post_migrate在你的应用程序配置的准备方法信号.在您更新文档之前,您链接到的Google论坛已过期.
您还需要在设置中指定应用程序配置INSTALLED_APPS.
INSTALLED_APPS = [
'myapp.apps.MyAppConfig',
# ...
]
Run Code Online (Sandbox Code Playgroud)
配置应用的另一种方法是使用default_app_config在__init__.py你的应用程序.请参阅配置应用.但另一种方式(AppConfig的虚线路径)是首选.
小智 8
我之前已经为另一个问题做过一个 post_migrate 示例。我将写下它的解决方案。也许这对你有帮助。
# in apps.py
...
from django.conf import settings
from django.db.models.signals import post_migrate
def create_default_site_profile(sender, **kwargs):
"""after migrations"""
from django.contrib.sites.models import Site
from core.models import SiteProfile
site = Site.objects.get(id=getattr(settings, 'SITE_ID', 1))
if not SiteProfile.objects.exists():
SiteProfile.objects.create(site=site)
class CoreConfig(AppConfig):
name = 'core'
def ready(self):
post_migrate.connect(create_default_site_profile, sender=self)
# if you have other signals e.g. post_save, you can include it
# like the one below.
from .signals import (create_site_profile)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3995 次 |
| 最近记录: |