إضافة أذونات مخصصة جديدة في جانغو
-
20-09-2019 - |
سؤال
وأستخدمه أذونات مخصصة في بلدي نماذج جانغو مثل هذا:
class T21Turma(models.Model):
class Meta:
permissions = (("can_view_boletim", "Can view boletim"),
("can_view_mensalidades", "Can view mensalidades"),)
والمشكلة هي أنني عندما إضافة إذن إلى قائمة لا يحصل تضاف إلى الجدول auth_permission
عند تشغيل syncdb. ما الخطأ الذي افعله. إذا ما يجعل أي فرق أستخدمه الجنوب لهجرات قاعدة البيانات.
المحلول
وجنوب لا تتبع django.contrib.auth الأذونات. انظر تذكرة # 211 للحصول على مزيد من المعلومات.
واحد من التعليقات على التذكرة تشير إلى أن استخدام الخيار --all
على syncdb قد يحل المشكلة.
نصائح أخرى
إذا كنت تريد "ترحيل manage.py" لتفعل كل شيء (دون استدعاء syncdb --all). تحتاج إلى إنشاء أذونات جديدة مع الهجرة:
user@host> manage.py datamigration myapp add_perm_foo --freeze=contenttypes --freeze=auth
وتحرير الملف الذي تم إنشاؤه:
class Migration(DataMigration):
def forwards(self, orm):
"Write your forwards methods here."
ct, created = orm['contenttypes.ContentType'].objects.get_or_create(
model='mymodel', app_label='myapp') # model must be lowercase!
perm, created = orm['auth.permission'].objects.get_or_create(
content_type=ct, codename='mymodel_foo', defaults=dict(name=u'Verbose Name'))
ويمكنك الاتصال إشارة post_migrate
من أجل تحديث الأذونات بعد الهجرة. يمكنني استخدام التعليمات البرمجية التالية، معدلة بشكل طفيف من ديف مع العاطفة و أصلا من <أ href ل = "http://packages.python.org/django-extensions/" يختلط = "noreferrer"> جانغو-ملحقات .
# Add to your project-level __init__.py
from south.signals import post_migrate
def update_permissions_after_migration(app,**kwargs):
"""
Update app permission just after every migration.
This is based on app django_extensions update_permissions management command.
"""
from django.conf import settings
from django.db.models import get_app, get_models
from django.contrib.auth.management import create_permissions
create_permissions(get_app(app), get_models(), 2 if settings.DEBUG else 0)
post_migrate.connect(update_permissions_after_migration)
وعندما كنت runnning الهجرة مع التعليمات البرمجية التالية
ct, created = orm['contenttypes.ContentType'].objects.get_or_create(model='mymodel', app_label='myapp') # model must bei lowercase!
perm, created = orm['auth.permission'].objects.get_or_create(content_type=ct, codename='mymodel_foo')
وأحصل على الخطأ التالية
File "C:\Python26\lib\site-packages\south-0.7.3-py2.6.egg\south\orm.py", line 170, in __getitem__
raise KeyError("The model '%s' from the app '%s' is not available in this migration." % (model, app))
KeyError: "The model 'contenttype' from the app 'contenttypes' is not available in this migration."
لمنع هذا الخطأ، ط تعديل قانون
from django.contrib.contenttypes.models import ContentType
from django.contrib.auth.models import Permission
class Migration(DataMigration):
def forwards(self, orm):
"Write your forwards methods here."
ct = ContentType.objects.get(model='mymodel', app_label='myapp')
perm, created = Permission.objects.get_or_create(content_type=ct, codename='mymodel_foo')
if created:
perm.name=u'my permission description'
perm.save()