2011-10-11 38 views
16

trong django theo mặc định khi syncdb được chạy với django.contrib.auth cài đặt, nó tạo quyền mặc định trên mỗi mô hình ... như foo.can_change, foo.can_delete và foo.can_add. Để thêm quyền tùy chỉnh cho mô hình, người dùng có thể thêm lớp Meta: theo mô hình và xác định quyền ở đó, như được giải thích tại đây https://docs.djangoproject.com/en/dev/topics/auth/#custom-permissionsLàm cách nào để thêm quyền tùy chỉnh vào Mô hình người dùng trong django?

Câu hỏi của tôi là phải làm gì nếu muốn thêm quyền tùy chỉnh vào Mô hình người dùng? như foo.can_view. Tôi có thể làm điều này với đoạn mã sau,

ct = ContentType.objects.get(app_label='auth', model='user') 
perm = Permission.objects.create(codename='can_view', name='Can View Users', 
            content_type=ct) 
perm.save() 

Nhưng tôi muốn thứ gì đó có thể chơi độc đáo với syncdb, ví dụ như lớp Meta trong mô hình tùy chỉnh của tôi. Tôi chỉ nên có những trong lớp Meta: dưới UserProfile vì đó là cách để mở rộng mô hình người dùng. nhưng đó là cách PHẢI để làm điều đó? Nó sẽ không buộc nó vào mô hình UserProfile?

+0

Bạn có thể làm điều đó trong mô hình di cư: http://stackoverflow.com/a/32706020/538284 –

Trả lời

3

Tôi không nghĩ rằng có một "quyền" trả lời ở đây, nhưng tôi sử dụng mã chính xác giống như bạn ngoại trừ tôi thay đổi Permission.objects.create-Permission.objects.get_or_create và làm việc tìm để đồng bộ với syncdb

+0

sẽ không get_or_create, tạo sự cho phép khác nếu thay đổi tên nhưng tên mã vẫn giữ nguyên? –

+1

bạn chỉ nên sử dụng tên mã là phần nhận hoặc tạo và đặt tên trong "mặc định" – leech

8

Bạn có thể làm một cái gì đó như này:

trong __init__.py của ứng dụng Django bạn add:

from django.db.models.signals import post_syncdb 
from django.contrib.contenttypes.models import ContentType 
from django.contrib.auth import models as auth_models 
from django.contrib.auth.models import Permission 

# custom user related permissions 
def add_user_permissions(sender, **kwargs): 
    ct = ContentType.objects.get(app_label='auth', model='user') 
    perm, created = Permission.objects.get_or_create(codename='can_view', name='Can View Users', content_type=ct) 
post_syncdb.connect(add_user_permissions, sender=auth_models) 
+0

Đưa vào '__init __. Py' và kết nối với' post_syncdb' có lẽ là một ý tưởng hay, nhưng đoạn mã trên không 't làm việc cho tôi. Tôi phải sử dụng 'ContentType.objects.get_for_model (model = auth_models.User)'. Nếu không, nó hoạt động. – brianmearns

2

Một câu trả lời được cập nhật cho Django 1.8. Tín hiệu pre_migrate được sử dụng thay vì pre_syncdb, vì syncdb không được dùng nữa và tài liệu khuyên bạn nên sử dụng pre_migrate thay vì post_migrate nếu tín hiệu sẽ thay đổi cơ sở dữ liệu. Ngoài ra, @receiver được sử dụng để kết nối add_user_permissions với tín hiệu.

from django.db.models.signals import pre_migrate 
from django.contrib.contenttypes.models import ContentType 
from django.contrib.auth import models as auth_models 
from django.contrib.auth.models import Permission 
from django.conf import settings 
from django.dispatch import receiver 


# custom user related permissions 
@receiver(pre_migrate, sender=auth_models) 
def add_user_permissions(sender, **kwargs): 
    content_type = ContentType.objects.get_for_model(settings.AUTH_USER_MODEL) 
    Permission.objects.get_or_create(codename='view_user', name='View user', content_type=content_type) 
+3

Tôi có thể yêu cầu tôi phải đặt mã này vào tập tin nào không? Tôi mặc dù nó đã được thiết lập trong các mô hình như trong phiên bản trước của Django nhưng tôi không chắc chắn ... – softwareplay

+0

@mcastle Tôi đặt điều này trong '__init __. Py' nhưng truy vấn" DoesNotExist: ContentType matching không tồn tại. " lỗi vẫn đang đến –

Các vấn đề liên quan