2011-01-25 25 views

Trả lời

70

Bạn có thể truy cập các nhóm chỉ cần thông qua thuộc tính groups trên User.

from django.contrib.auth.models import User, Group 

group = Group(name="Editor") 
group.save()     # save this new group for this example 
user = User.objects.get(pk=1) # assuming, there is one initial user 
user.groups.add(group)  # user is now in the "Editor" group 

sau đó user.groups.all() lợi nhuận [<Group: Editor>]

+87

Việc kiểm tra thực tế sẽ là 'nếu user.groups.filter (name = group_name) .count(): # làm điều gì đó ' – Maccesch

+113

hoặc sử dụng .exists() thay vì .count() –

10

Nếu bạn cần các danh sách người dùng đang ở trong một nhóm, bạn có thể làm điều này thay vì:

from django.contrib.auth.models import Group 
users_in_group = Group.objects.get(name="group name").user_set.all() 

và sau đó kiểm tra

if user in users_in_group: 
    # do something 

để kiểm tra xem người dùng có trong nhóm không.

+4

Điều này không mở rộng tốt cho các trang web có nhiều người dùng vì nó sẽ tải bảng người dùng tập hợp con lớn vào bộ nhớ mỗi khi nó chạy. – bhuber

0

Chỉ trong trường hợp nếu nhóm bạn muốn của người dùng kiểm tra thuộc về một danh sách nhóm được xác định trước:

def is_allowed(user): 
    allowed_group = set(['admin', 'lead', 'manager']) 
    usr = User.objects.get(username=user) 
    groups = [ x.name for x in usr.groups.all()] 
    if allowed_group.intersection(set(groups)): 
     return True 
    return False 
+2

[FYI bạn có thể nói {x.name cho x trong usr.groups.all()}] (http://docs.python.org/2/tutorial/datastructures.html#sets) – Kos

135

tài Đối tượng của bạn được liên kết với các đối tượngNhóm thông qua một mối quan hệManyToMany.

Do đó, bạn có thể áp dụng phương pháp bộ lọc cho user.groups.

Vì vậy, để kiểm tra xem một người dùng nhất định là trong một nhóm nhất định ("Thành viên" cho ví dụ), chỉ cần làm điều này:

def is_member(user): 
    return user.groups.filter(name='Member').exists() 

Nếu bạn muốn kiểm tra xem một người dùng nào đó thuộc về nhiều hơn một nhóm nhất định, sử dụng __in điều hành như sau:

def is_in_multiple_groups(user): 
    return user.groups.filter(name__in=['group1', 'group2']).exists() 

Lưu ý rằng những chức năng có thể được sử dụng với @user_passes_test trang trí quản lý truy cập đến quan điểm của bạn:

from django.contrib.auth.decorators import login_required, user_passes_test 
@login_required 
@user_passes_test(is_member) # or @user_passes_test(is_in_multiple_groups) 
def myview(request): 
    # Do your processing 

Hy vọng điều này giúp đỡ

+4

Tôi không chắc chắn về các hoạt động bên trong của truy cập DB của django, nhưng điều này có vẻ hiệu quả hơn sau đó một số gợi ý khác, như nhận tất cả người dùng trong nhóm và thực hiện một tiêu chuẩn python 'người dùng trong nhóm' (hoặc ngược lại). – brianmearns

+0

Cảm ơn bạn đã bình luận! – Charlesthk

+1

Bạn không phải thêm '.exists()' vào cuối để trả về boolean? Nếu không 'is_member()' và 'is_in_multiple_groups()' sẽ trả về một 'QuerySet', có thể không cho kết quả mong muốn. –

0

Trong một dòng:

'Groupname' in user.groups.values_list('name', flat=True) 

này đánh giá cho một trong hai True hoặc False.

+1

Điều này là không hiệu quả, vì nó sẽ tìm nạp nhiều dữ liệu hơn, và sau đó hoạt động trên nó ở bên django. db làm công việc – WhyNotHugo

6

Bạn chỉ cần một dòng:

from django.contrib.auth.decorators import user_passes_test 

@user_passes_test(lambda u: u.groups.filter(name='companyGroup').exists()) 
def you_view(): 
    return HttpResponse("Since you're logged in, you can see this text!") 
+3

Không phải là mã rất sạch mặc dù, và không phải là rất có thể tái sử dụng, nhưng 1 cho việc nó thành một dòng – WhyNotHugo

10

Nếu bạn không cần dụ dùng trên trang web (như tôi đã làm), bạn có thể làm điều đó với

User.objects.filter(pk=userId, groups__name='Editor').exists() 

này sẽ sản xuất chỉ một yêu cầu đến cơ sở dữ liệu và trả về một boolean.

7

Nếu người dùng thuộc về một nhóm nào đó hay không, có thể được kiểm tra trong các mẫu django sử dụng:

{% if group in request.user.groups.all %} "some action" {% endif %}

+1

điều này không làm việc cho tôi, có vẻ như yêu cầu so sánh nhóm với tên nhóm – hosein

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