2011-07-12 13 views
12

Tôi có ứng dụng Django cho phép nhiều loại người dùng khác nhau: công ty, quản trị viên, người bên ngoài v.v. Tất nhiên điều này dễ quản lý với hệ thống xác thực và nhóm mặc định.Django - Hồ sơ người dùng thuộc các loại khác nhau

Vấn đề của tôi là người dùng thuộc các nhóm khác nhau sẽ có thông tin liên quan khác nhau - ví dụ các công ty sẽ cần cung cấp một số thông tin thương mại không có ý nghĩa cho người dùng cá nhân. Do đó tôi cần phải đính kèm các loại hồ sơ khác nhau, tùy thuộc vào nhóm. (Trong các nhóm ứng dụng của tôi là loại trừ lẫn nhau.)

Thật không may, Django chỉ cho phép một mô hình duy nhất được đính kèm dưới dạng hồ sơ và mô hình đó được khai báo trong settings.AUTH_PROFILE_MODULE. Nội bộ, được truy xuất theo phương thức User.get_profile(), về cơ bản chỉ đọc giá trị này và thực hiện một số kiểm tra, ví dụ như mô hình thực sự tồn tại.

Tôi đã nghĩ đến việc phân lớp User và ghi đè phương thức get_profile(), sao cho nó trả về một mô hình khác tùy thuộc vào nhóm.

Is there a simpler/cleaner way to manage different kind of profiles?

Những gì tôi đang đề xuất có vẻ hơi hack, xem hồ sơ người dùng đã được giới thiệu chính xác để tránh phải phân lớp người dùng.

Trả lời

16

Tạo mô hình với OneToOneField đến Userrelated_name.

E. G .:

class Firm(models.Model): 
    user = models.OneToOneField(User, related_name='firm') 
    # other fields 

class External(models.Model): 
    user = models.OneToOneField(User, related_name='external') 
    # other fields 

Sau đó, bạn có thể kiểm tra sự tồn tại của việc này thuộc tính trong user (if hasattr(request.user, 'firm')) và trả lại ví dụ thích hợp. Tôi sẽ đặt nó vào phần mềm trung gian tùy chỉnh, ví dụ như sẽ đặt request.user_profile.

+0

Điều này hóa ra là cách đơn giản nhất. Vấn đề của tôi bây giờ là đảm bảo rằng các hồ sơ này thực sự được điền từ quản trị viên. http://stackoverflow.com/questions/6681464/django-admin-validating-inlines-together-with-main-models – Andrea

+0

Mô hình người dùng này không phải là một điều mặc định đi kèm với Django phải không? Bởi vì tôi nhận được 'NameError: name 'User' không được định nghĩa' khi tôi thử này –

+1

@JulioMarins Vâng, bạn nên nhập nó:' từ django.contrib.auth.models import User' – DrTyrsa