2009-03-24 27 views
6

Trong đơn của tôi, tôi có sinh viên, giáo sư và nhân viên. Nhân viên không cần một hồ sơ nhưng các giáo sư và sinh viên đều cần một hồ sơ khác. Tôi không muốn thực hiện nó tất cả bản thân mình (middleware và whatnot), do đó, có anyway để chỉ có get_profile() trả về một hồ sơ khác nhau tùy thuộc vào vai trò của người dùng?Cách tốt nhất để có hồ sơ khác nhau cho các loại người dùng khác nhau trong django là gì?

Trả lời

7

Với Django 1.1, hiện đang ở giai đoạn thử nghiệm, tôi sẽ triển khai proxy model.

class MyUser(User): 

    class Meta: 
    proxy = True 

    def get_profile(self): 
    if self.role == 'professor': 
     return ProfessorProfile._default_manager.get(user_id__exakt=self.id) 
    elif self.role == 'student': 
     return StudentProfile._default_manager.get(user_id__exakt=self.id) 
    else: 
     # staff 
     return None 

get_profile cần mã bộ nhớ đệm từ tệp gốc và vân vân. Nhưng về cơ bản bạn có thể làm một cái gì đó như thế.

Với Django 1.0.x bạn có thể triển khai các lớp dẫn xuất dựa trên User, nhưng điều này có thể phá vỡ mã ở những nơi khác. Đối với những thứ như thế tôi yêu các lớp proxy, chỉ cần thêm chức năng python mà không thay đổi các mô hình cơ sở dữ liệu.

+0

Những giao diện này hữu ích nhưng điều này vẫn đặt ra cùng một vấn đề chính xác mà tôi có với việc sử dụng nhiều loại người dùng/hồ sơ của riêng tôi: các ứng dụng hiện tại không biết về nó. Họ chỉ tạo ra các cá thể người dùng, vì vậy phương pháp tốt đẹp này hoàn toàn bị bỏ qua. – ironfroggy

+0

Có, nhiều mô hình người dùng vẫn còn có vấn đề, nhưng các cấu hình khác nhau dựa trên vai trò có thể được giải quyết. –

0

Bạn có rad http://docs.djangoproject.com/en/dev/topics/auth/#auth-profiles không?

Đó là giải pháp tiêu chuẩn.

+2

Tôi đã đọc điều đó. Những gì tôi cần là các loại hồ sơ khác nhau cho các loại người dùng khác nhau, giải pháp đó sẽ chỉ cung cấp một loại tiểu sử cho tất cả người dùng. –

+0

Vui lòng cập nhật câu hỏi của bạn với ví dụ về "các loại tiểu sử khác nhau". Thông thường, chúng tôi xác định các tiểu sử có nhiều trường, một số trường là tùy chọn. Bạn đang nói về cái gì vậy? –

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