2012-01-15 13 views
7

मैं django-userena का उपयोग कर रहा हूं। मेरे पास UserProfile नामक एक मॉडल है। मैंने साइनअप फॉर्म में अतिरिक्त फ़ील्ड जोड़े हैं। और ये फ़ील्ड सही तरीके से दिखाई दे रहे हैं लेकिन डेटा सहेजा नहीं गया है। मैं कुछ फ़ील्ड डेटा को किसी अन्य मॉडल (Business) में भी सहेजना चाहता हूं। उदाहरण के लिए मेरे पास दो फ़ील्ड हैं जैसे contact और business। मैं चाहता हूं कि संपर्क क्षेत्र UserProfile पर जायेगा मॉडल और business फ़ील्ड Business Model पर जाएगा। कोई सुराग? धन्यवादdjango-userena रूपों को अतिरिक्त फ़ील्ड जोड़ने

यहाँ मेरी कोड

class SignupFormExtra(SignupForm): 
    address = forms.CharField(label=_(u'Address'),max_length=30,required=False) 
    contact = forms.CharField(label=_(u'Contact'),max_length=30,required=False) 
    business = forms.CharField(label=_(u'Business Name'),max_length=30,required=False) 

    def save(self): 
     """ 
     Override the save method to save the first and last name to the user 
     field. 

     """ 

     user_profile = super(SignupFormExtra, self).save(commit=False) 

     user_profile.address = self.cleaned_data['address'] 
     user_profile.contact = self.cleaned_data['contact'] 
     user_profile.business = self.cleaned_data['business'] 

     user_profile.save() 

     return user_profile 

अद्यतन है: मैं एक उपयोगकर्ता उदाहरण पर उन मूल्यों के संचय कर रहा हूँ ... मैं पैर की अंगुली चाहते प्रोफ़ाइल मॉडल पर उन्हें भंडारण - एक उदाहरण है कि उपयोगकर्ता के लिए बाध्य कर रहा है

+0

आप इसे की कोशिश की है करता है? – Ahsan

उत्तर

11

यहां यूरेनिया के लेखक। मेरे पास पहले से "no_access" के साथ एक ई-मेल पत्राचार था, लेकिन अगर समाधान में अन्य समस्याएं हैं तो समाधान के लिए यह महत्वपूर्ण है। पहली गलती यह थी कि save विधि एक प्रोफ़ाइल देता है। यह सच नहीं है, यह एक Django User देता है। इस वजह से आपको पहले प्रोफ़ाइल लाने और इसमें बदलाव करना होगा। प्रोफ़ाइल को सहेजें और फिर उपयोगकर्ता को फिर से उपयोग करें ताकि इसे यूरेनिया के साथ संगत बनाए रखा जा सके।

Business मॉडल के लिए, इसे save विधि में भी जोड़ें।

class SignupFormExtra(SignupForm): 
    address = forms.CharField(label=_(u'Address'),max_length=30,required=False) 
    contact = forms.CharField(label=_(u'Contact'),max_length=30,required=False) 
    business = forms.CharField(label=_(u'Business Name'),max_length=30,required=False) 

    def save(self): 
     """ 
     Override the save method to save the first and last name to the user 
     field. 

     """ 
     # Original save method returns the user 
     user = super(SignupFormExtra, self).save() 

     # Get the profile, the `save` method above creates a profile for each 
     # user because it calls the manager method `create_user`. 
     # See: https://github.com/bread-and-pepper/django-userena/blob/master/userena/managers.py#L65 
     user_profile = user.get_profile() 

     # Be sure that you have validated these fields with `clean_` methods. 
     # Garbage in, garbage out. 
     user_profile.address = self.cleaned_data['address'] 
     user_profile.contact = self.cleaned_data['contact'] 
     user_profile.save() 

     # Business 
     business = self.cleaned_data['business'] 
     business = Business.objects.get_or_create(name=business) 
     business.save() 

     # Return the user, not the profile! 
     return user 

फॉर्म बनाने के बाद, अपने urls.py में उपयोगरेना फॉर्म को ओवरराइड करना न भूलें। ऐसा कुछ ऐसा करेगा:

url(r'^accounts/signup/$', 
     userena_views.signup, 
     {'signup_form': SignupFormExtra}), 

यह चाल चलाना चाहिए! सौभाग्य।

+0

हाँ मुझे आपका ईमेल मिला। धन्यवाद। क्या आप कृपया इस लिनके की जांच करेंगे? मुझे लगता है [वहां बग है] http://stackoverflow.com/questions/8818435/many-to-many-field-added-to-the-profile-does-not-work-django-userena) – Kulbir

+2

बहुत बढ़िया! अब आपको बस डॉक्स अपडेट करना है :) http://docs.django-userena.org/en/latest/faq.html#how-do-i-add-extra-fields-to-forms –

1

मैंने उपर्युक्त चाल की कोशिश की है, और ऐसा लगता है कि यह काम करता है। हालांकि, मैं एक त्रुटि में चल रहा हूं और कभी भी मेरी स्थापना में सेव फ़ंक्शन नहीं ले रहा हूं। मेरे पास यह सेटिंग मेरी सेटिंग्स फ़ाइल में है: USERENA_WITHOUT_USERNAMES = True इसलिए, जब मैं नए फ़ील्ड को शामिल करने के लिए फॉर्म को बढ़ाता हूं, तो मुझे कभी भी सहेजने की विधि नहीं मिलती क्योंकि मुझे 'फ़ील्ड आवश्यक' मिलता है, यह इस क्षेत्र के लिए है कि मैं नहीं हूं (उपयोगकर्ता नाम) का उपयोग कर।

मैं दृश्य निर्माण यहां लाइन में देखें: अगर userena_settings.USERENA_WITHOUT_USERNAMES और (signup_form == SignupForm): signup_form = SignupFormOnlyEmail तो, मैं उदाहरण SignupFormOnlyEmail बजाय SignupForm उपवर्ग के लिए बदल गया है और यह काम करता है। इसलिए, यदि आप USERENA_WITHOUT_USERNAMES का उपयोग कर रहे हैं, तो यदि आप साइनअप फॉर्म को बदलना चाहते हैं तो एक अलग फॉर्म उप-वर्ग करें।

मुझे पता है यह इस सवाल (वास्तव में) का जवाब नहीं है, लेकिन, यह थोड़े प्रपत्र के स्वच्छ विधि में :-)

जी

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