2010-06-23 10 views
10

Tôi đang sử dụng đăng ký django trong đơn đăng ký của mình. Tôi muốn tạo các loại người dùng khác nhau với các cấu hình khác nhau. Ví dụ: một người dùng là giáo viên và một người dùng khác là sinh viên.Đăng ký Django và nhiều hồ sơ

Làm cách nào để sửa đổi đăng ký để đặt user_type và tạo đúng cấu hình?

+0

bạn có một typ o có: P – jonasespelita

Trả lời

12

Long trả lời: p

tôi đã tìm thấy The Missing Manual bài vô giá cho các loại hình vấn đề vì nó giải thích nhiều tính năng của django-profile và hệ thống django-đăng ký.

tôi muốn đề nghị sử dụng multi table inheritance trên hồ sơ đơn bạn được phép thiết lập thông qua các AUTH_PROFILE_MODULE

Ví dụ

#models.py 
class Profile(models.Model): 
    #add any common fields here (first_name, last_name and email come from User) 

    #perhaps add is_student or is_teacher properites here 
    @property 
    def is_student(self): 
     try: 
      self.student 
      return True 
     except Student.DoesNotExist: 
      return False 

class Teacher(Profile): 
    #teacher fields 

class Student(Profile): 
    #student fields 

django đăng ký sử dụng tín hiệu để thông báo cho bạn về một đăng ký. Bạn nên tạo hồ sơ tại thời điểm đó để bạn tự tin rằng các cuộc gọi tới user.get_profile() sẽ luôn trả về một hồ sơ. Mã tín hiệu được sử dụng là

#registration.signals.py 
user_registered = Signal(providing_args=["user", "request"]) 

Điều này có nghĩa là khi xử lý tín hiệu bạn có quyền truy cập yêu cầu. Vì vậy, khi bạn POST biểu mẫu đăng ký bao gồm một trường xác định loại người dùng nào cần tạo.

#signals.py (in your project) 
user_registered.connect(create_profile) 

def create_profile(sender, instance, request, **kwargs): 
    from myapp.models import Profile, Teacher, Student 

    try: 
     user_type = request.POST['usertype'].lower() 
     if user_type == "teacher": #user .lower for case insensitive comparison 
      Teacher(user = instance).save() 
     elif user_type == "student": 
      Student(user = instance).save() 
     else: 
      Profile(user = instance).save() #Default create - might want to raise error instead 
    except KeyError: 
     Profile(user = instance).save() #Default create just a profile 

Nếu bạn muốn thêm bất kỳ thứ gì vào mẫu được tạo, không được bao gồm bởi giá trị trường mặc định, tại thời điểm đăng ký, bạn rõ ràng có thể lấy từ yêu cầu.

1

http://docs.djangoproject.com/en/1.2/topics/auth/#groups

nhóm Django là một cách tuyệt vời để xác định những gì bạn đang tìm kiếm. Bạn có thể có một số User extended profile sẽ chứa tất cả các thuộc tính của giáo viên và học sinh.

class MasterProfile(models.Model): 
    user = models.ForeignKey(User, unique=True) 
    # add all the fields here 

Sau đó xác định các nhóm: teacherstudent và bạn kết hợp mỗi MasterProfile để một giáo viên hoặc một học sinh.

Bảng Django Group có thể giúp bạn xác định các vai trò khác nhau của bạn và phân bổ người dùng cho các nhóm chính xác.

+0

Nhưng làm thế nào để bạn phân biệt các trường theo cách này?Giáo viên và học sinh sẽ có cùng các lĩnh vực, tôi có đúng không? Thông thường, nhiều loại hồ sơ là cần thiết để có các trường khác nhau cho từng loại người dùng. – Leonardo

1

Tôi gặp vấn đề tương tự và tôi đã thử câu trả lời do Chris đề xuất, tuy nhiên nó không hiệu quả đối với tôi.

Tôi chỉ là một newbie trong Django, nhưng tôi nghĩ rằng args chụp bởi handler create_profile phải phù hợp với những người dưới providing_args bởi tín hiệu user_registered, và trong câu trả lời của Chris họ không (Tôi nghĩ rằng họ có thể phù hợp với những tín hiệu đi ngang qua post_save , mà tôi đã nhìn thấy được sử dụng trong tay Thiếu rằng ông trích)

tôi đổi mã của mình để làm args trận đấu:

def create_profile(sender, **kwargs): 
    """When user is registered also create a matching profile.""" 

    request, instance = kwargs['request'], kwargs['user'] 

    # parse request form to see whether profile is student or teacher 
    try: 
     user_type = request.POST['usertype'].lower() 
     print(user_type) 
     if user_type == "teacher": #user .lower for case insensitive comparison 
      Teacher(user = instance).save() 
     elif user_type == "student": 
      Student(user = instance).save() 
     else: 
      Userprofile(user = instance).save() #Default create - might want to raise error instead 
    except KeyError: 
     Userprofile(user = instance).save() #Default create just a profile 

và dường như được làm việc tại