2010-06-23 19 views
10

Uygulamamda django kaydı kullanıyorum. Farklı profillere sahip farklı türde kullanıcılar oluşturmak istiyorum. Örneğin, bir kullanıcı bir öğretmendir ve başka bir kullanıcı bir öğrencidir.Django kaydı ve çoklu profiller

Kullanıcı_türü ayarlamak ve doğru profili oluşturmak için kaydı nasıl değiştirebilirim?

+0

çalışıyor görünüyor o var: P – jonasespelita

cevap

12

Uzun cevap: p ben django-profil ve django-kayıt sistemlerinin özelliklerinin çoğunu açıkladığı gibi sorunun bu tür The Missing Manual sonrası çok değerli buldum

.

Sana

#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-kayıt bir kayıt bildirmek üzere sinyalleri kullanır Örneğin AUTH_PROFILE_MODULE

aracılığıyla ayarlamak için izin konum tek profilde multi table inheritance kullanmanızı öneririz. Bu noktada profili oluşturmalısınız, böylece user.get_profile() öğesinin çağrısının her zaman bir profil döndüreceğinden eminsiniz. kullanılan sinyal kodu Yaptığınız istekte erişiminiz olduğundan sinyal işlerken demektir

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

olduğunu. Bu nedenle, POST kaydolduktan sonra kayıt formunu, hangi kullanıcı türünün oluşturulacağını tanımlayan bir alan içerir. Eğer oluşturulan modele şey eklemek istiyorsanız

#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 

, bu tabii ki istek o indirebiliriz kayıt sırasında, varsayılan alan değerleri kapsamında değildir.

1

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

Django grupları aradığınızı tanımlamak için harika bir yoldur. Öğretmenlerin ve öğrencilerin tüm özelliklerini içerecek bir User extended profile'a sahip olabilirsiniz.

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

Sonra gruplarını tanımlar: teacher ve student ve her MasterProfile bir öğretmen veya öğrenci birine ilişkilendirmek.

Django Grubu tablosu, çeşitli rollerinizi tanımlamanıza ve kullanıcıları doğru gruplara ayırmanıza yardımcı olabilir.

+0

Ama alanları bu şekilde nasıl ayırt edersiniz?Öğretmenler ve öğrenciler aynı alana sahip olacaklar, değil mi? Her kullanıcı türü için farklı alanlara sahip olmak için genellikle birden fazla profil türü gereklidir. – Leonardo

1

Aynı sorunu yaşadım ve Chris tarafından önerilen yanıtı denedim, ancak benim için çalışmadı.

Django sadece bir acemi değilim, ama işleyicisi create_profile tarafından alınan args sinyali user_registered tarafından providing_args altında eşleşmesi gerekir düşünüyorum ve Chris'in yanıtında onlar (ı muhtemelen sinyal post_save geçti eşleşmiyor sanmıyorum Ben Eksik Kılavuzunda kullanılan görüldü olduğunuz o ben args maç yapmak için onun kodunu modifiye

) tırnak olun:

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 

ve bir TYP var şimdi