2010-06-23 16 views
10

मैं अपने आवेदन में django-पंजीकरण का उपयोग कर रहा हूं। मैं अलग-अलग प्रोफाइल के साथ विभिन्न प्रकार के उपयोगकर्ताओं को बनाना चाहता हूं। उदाहरण के लिए, एक उपयोगकर्ता एक शिक्षक है और दूसरा उपयोगकर्ता एक छात्र है।Django पंजीकरण और एकाधिक प्रोफाइल

उपयोगकर्ता_type सेट करने और सही प्रोफ़ाइल बनाने के लिए मैं पंजीकरण कैसे संशोधित कर सकता हूं?

+0

आप एक typ है काम कर रहा है ओ वहाँ: पी – jonasespelita

उत्तर

12

लांग जवाब: p

मैं The Missing Manual पोस्ट इस तरह की समस्या के लिए अमूल्य यह Django-प्रोफाइल और Django पंजीकरण प्रणाली की विशेषताओं में से कई के रूप में बताते हैं पाया है।

मैं एकल प्रोफाइल आप AUTH_PROFILE_MODULE

के माध्यम से स्थापित करने के लिए उदाहरण के लिए

#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 पंजीकरण संकेतों का उपयोग करता एक पंजीकरण के बारे में सूचित करने की अनुमति है पर multi table inheritance उपयोग करने का सुझाव चाहते हैं। आपको उस बिंदु पर प्रोफ़ाइल बनाना चाहिए ताकि आपको विश्वास हो कि उपयोगकर्ता.get_profile() पर कॉल हमेशा एक प्रोफ़ाइल लौटाएंगे। संकेत इस्तेमाल किया कोड

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

जब कि संकेत आपके द्वारा किए गए अनुरोध के लिए उपयोग किया निपटने जिसका मतलब है है। तो जब आप पंजीकरण फॉर्म पोस्ट करते हैं तो वह फ़ील्ड शामिल होता है जो पहचानता है कि किस प्रकार के उपयोगकर्ता को बनाना है।

#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 

आप मॉडल है कि बनाई गई है ऐसा कुछ भी शामिल करना चाहते हैं, जो डिफ़ॉल्ट फ़ील्ड मान में शामिल नहीं है, पंजीकरण समय में आपको स्पष्ट रूप से अनुरोध है कि खींच सकते हैं।

1

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

Django समूहों के लिए आप क्या देख रहे हैं परिभाषित करने के लिए एक शानदार तरीका है। आपके पास एक User extended profile हो सकता है जिसमें शिक्षकों और छात्रों के सभी गुण शामिल होंगे।

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

तब समूहों को परिभाषित: teacher और student और आप प्रत्येक MasterProfile या तो एक शिक्षक या एक छात्र को संबद्ध करते हैं।

Django समूह तालिका आपको अपनी विभिन्न भूमिकाओं को परिभाषित करने और उपयोगकर्ताओं को सही ढंग से समूहों को आवंटित करने में मदद कर सकती है।

+0

लेकिन आप इस तरह से खेतों को कैसे अलग करते हैं?शिक्षक और छात्र एक ही क्षेत्र के साथ खत्म हो जाएंगे, क्या मैं सही हूँ? आम तौर पर प्रत्येक उपयोगकर्ता प्रकार के लिए अलग-अलग फ़ील्ड रखने के लिए एकाधिक प्रोफ़ाइल प्रकारों की आवश्यकता होती है। – Leonardo

1

मेरे पास एक ही समस्या थी और मैंने क्रिस द्वारा सुझाए गए उत्तर की कोशिश की, हालांकि यह मेरे लिए काम नहीं करता था।

मैं Django में केवल एक नौसिखिया हूँ, लेकिन मुझे लगता है कि आर्ग हैंडलर create_profile द्वारा उठाए गए संकेत user_registered द्वारा providing_args के तहत उन लोगों से मेल खाना चाहिए, और क्रिस के जवाब में वे (मुझे नहीं लगता कि वे शायद संकेत post_save द्वारा पारित जानकारी से मेल खाते हैं है, जो मैं लापता मैनुअल में प्रयोग किया जाता देखा गया है वह उद्धरण कि)

मैं उसके कोड को संशोधित आर्ग मैच बनाने के लिए:

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 

और अब

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^