2013-06-05 46 views
14

Tính năng web của tôi có hai loại người dùng, Khách hàngProfessional. Ngoài ra còn có hai 'mô-đun chính', một cho khách hàng để mua các công cụ và vv (trang web chính), và một cho các chuyên gia để quản lý hoạt động. Đối với auth, tôi muốn có:Nhiều loại người dùng cho Auth ở Django

  • Biểu mẫu 'đăng nhập' đơn, phát hiện xem người dùng là khách hàng hay chuyên nghiệp và chuyển tiếp mô-đun phù hợp (trang web chính hoặc trang quản lý).
  • Hai biểu mẫu 'đăng ký', một cho khách hàng và một cho các chuyên gia. Có thể, trang web sẽ hỏi người dùng xem cô ấy có muốn đăng ký với tư cách là chuyên gia hay khách hàng không, để kích hoạt luồng đăng ký phù hợp cho từng trường hợp.
  • Khách hàng sẽ sử dụng 'trang web chính' và không được phép sử dụng 'trang web quản lý'.
  • Các chuyên gia sẽ sử dụng 'trang web quản lý' nhưng không được phép đăng nhập vào trang web chính.
  • Cả hai chuyên gia và khách hàng được đăng ký như người dùng, và chia sẻ lĩnh vực phổ biến, chẳng hạn như tên người dùng, điện thoại, email, vv ...

Kể từ Django sẽ không cho phép tôi sử dụng hai mô hình để xác thực. Tôi đã tạo mô hình tùy chỉnh phân lớp AbstractBaseUser và nó phục vụ tôi như một lớp auth cơ sở cho Máy khách và Chuyên gia.

class BaseUser(AbstractBaseUser): 
    ... 

class Client(BaseUser): 
    ... 

class Professional(BaseUser): 
    ... 

Tôi cũng đã thay đổi các thiết lập AUTH_USER_MODEL tới:

AUTH_USER_MODEL = 'myapp.BaseUser' 

Tôi cũng đã bao gồm django-allauth để quản lý đăng ký sử dụng và xác thực. Nhưng bây giờ tôi đang mắc kẹt. Tôi chỉ mới bắt đầu chơi với Django/Python và tôi không chắc chắn làm thế nào để giải quyết điều này.

Dường như không có cách nào được khuyến nghị chính thức để thực hiện việc này (Implementing multiple user types with Django 1.5). Tôi có nên gắn bó với cách tiếp cận phân lớp, hay tôi nên làm mối quan hệ OnetoOne được chỉ ra trong docs?

Khi tôi đã thiết lập đúng mô hình, tôi nên tiếp tục với hai biểu mẫu đăng ký như thế nào? Có thể thực hiện điều này với django-allauth hay tôi cần phải thực hiện thủ công?

Theo như tôi biết, khi người dùng mới được đăng ký, người dùng cơ sở mới được tạo trong bảng Người dùng. Nhưng vì tôi sẽ tạo chuyên môn người dùng (Khách hàng hoặc Chuyên gia), tôi nên chỉ định rằng tôi cũng muốn tạo dữ liệu liên quan đến khách hàng hoặc dữ liệu liên quan đến chuyên nghiệp trong bảng tương ứng như thế nào?

Tôi khá mới để Django, vì vậy bất kỳ lời khuyên sẽ giúp

Trả lời

8

Tôi nghĩ rằng cách dễ nhất để bạn có thể làm những gì bạn đang nói về sẽ là có 3 ứng dụng trong dự án của bạn: cấp cao nhất của bạn ứng dụng, ứng dụng "chuyên nghiệp" và ứng dụng "khách hàng". Ở ứng dụng cấp cao nhất, tất cả những gì bạn thực sự cần làm là cung cấp cho người dùng biểu mẫu đăng nhập và 2 liên kết, một để đăng ký làm Chuyên gia và một để đăng ký làm Khách hàng.

Trong trường hợp này, tôi tin rằng bạn sẽ dễ dàng sử dụng hệ thống Quyền được xây dựng của Django và gán từng loại người dùng cho một nhóm tương ứng (ví dụ: các chuyên gia và khách hàng).Bạn có thể sử dụng một trình trang trí trên quan điểm của mình để đảm bảo rằng chỉ các thành viên của một nhóm cụ thể mới có thể truy cập chế độ xem đó (vì bạn có 2 ứng dụng riêng biệt cho mỗi nhóm, bạn có thể thêm trang trí cho tất cả chế độ xem trong mỗi nhóm hoặc bạn có thể nhập Django's chức năng ủy quyền vào urls.py của bạn và kiểm tra nó ở đó, mặc dù điều đó nằm ngoài phạm vi của câu trả lời này).

Đăng ký đủ dễ dàng, sử dụng tệp urls.py của bạn để chuyển tiếp người dùng muốn đăng ký đúng ứng dụng. Một khi bạn làm điều đó, bạn sẽ có thể sử dụng đăng ký django-allauth trên mỗi ứng dụng, cho phép bạn tạo 2 loại người dùng khác nhau. Hãy chắc chắn rằng khi đăng ký, bạn chỉ định chúng cho các thành viên nhóm chính xác. Đối với chuyển hướng đăng nhập, khi bạn nhận được dữ liệu POST, tôi sẽ kiểm tra loại người dùng đã đăng nhập và sử dụng để chuyển tiếp người dùng đến đúng URL đi kèm với ứng dụng Chuyên nghiệp hoặc Ứng dụng khách. Bạn có thể xem liên kết dưới đây để biết ý tưởng chuyển hướng người dùng sau khi đăng nhập.

Django - after login, redirect user to his custom page --> mysite.com/username

+0

Cảm ơn, bạn đã cho tôi hướng dẫn tuyệt vời về bố cục dự án. Nhưng, những gì về các mô hình? Bạn có nghĩ rằng việc tạo hai mô hình Chuyên nghiệp và Khách hàng với OneToOnefield liên kết ngược với mô hình Người dùng là ok? Bằng cách đó tôi có thể dễ dàng quản lý cả hai loại người dùng mà tôi đoán ... – jaime

+2

Đó chắc chắn là một lựa chọn, và nó không nhất thiết là một lựa chọn tồi trừ khi bạn muốn mở rộng quy mô. Tùy chọn khác là tạo tất cả các trường trong một mô hình người dùng duy nhất và sử dụng các hàm mô hình để xác định trường nào áp dụng cho các loại người dùng khác nhau. Về cơ bản, thay vì có công cụ DB của bạn xác định các trường nào có thể không null, hoặc giới hạn giá trị, hoặc bất kỳ thứ gì khác cho vấn đề đó, bạn có thể làm cho Django thực thi tính toàn vẹn và linh hoạt hơn một chút trong những mục bạn có thể làm với một mô hình. –

+0

@TitusP vui lòng xem câu hỏi này: http://stackoverflow.com/questions/35252375/trouble-understaing-user-object-in-django?noredirect=1#comment58217925_35252375 – user3497437