दिलचस्प पोस्ट
कैसे एंड्रॉयड में sdcard फ़ोल्डर में सहेजा छवियों को प्रदर्शित करने के लिए AJAX – एकाधिक डेटा पायथन 3.4 के लिए माइक्रोसॉफ्ट विज़ुअल सी ++ कंपाइलर अपवाद उठाने पर मैं एक पायथन ट्रसबैक वस्तु को कैसे संशोधित कर सकता हूँ? दो तारों के बीच समानता का प्रतिशत ढूंढें एंट में <classpath> से स्पष्ट क्लास-पथ जेनरेट करें गैर-इंटरैक्टिव बैश शेल में उपनाम क्यों काम नहीं करते PHP में एक अनिवार्य समारोह क्या है? जीमेल थ्री-फ्रैग्मेंट एनीमेशन परिदृश्य का पूरा कार्य नमूना? जांचें कि क्या स्ट्रिंग जेएस में एक regex से मेल खाता है Facetted ggplot के लिए अलग किंवदंतियों और भरने के रंग? मैं उद्देश्य- C में एक विधि कैसे कॉल कर सकता हूं? स्विफ्ट में एक वैकल्पिक मूल्य क्या है? जावा के साथ सेलेनियम वेबड्राइवर (सेलेनियम 2) में अलर्ट हैंडलिंग Android में फ्रैगमेंट्स और गतिविधि के बीच डेटा साझा करना

Django में first_name, last_name संशोधनों के साथ एक UserProfile फ़ॉर्म कैसे बना सकता है?

अगर मुझे लगता है कि मेरा प्रश्न बहुत स्पष्ट है और UserProfile साथ काम करने वाले लगभग हर डेवलपर इसका उत्तर देने में सक्षम होना चाहिए।

हालांकि, मैं डीजेगो दस्तावेज या Django पुस्तक में कोई मदद नहीं मिल सका।

जब आप Django फॉर्म के साथ एक UserProfile प्रपत्र बनाना चाहते हैं, तो आप प्रोफ़ाइल फ़ील्ड के साथ-साथ कुछ User फ़ील्ड को भी संशोधित करना चाहते हैं।

लेकिन कोई forms.UserProfileForm नहीं है। forms.UserProfileForm (अभी तक?)!

आप उसे कैसे करते हैं?

Solutions Collecting From Web of "Django में first_name, last_name संशोधनों के साथ एक UserProfile फ़ॉर्म कैसे बना सकता है?"

मैं इस पर आज ठोकर खाई और कुछ googling के बाद मैं एक समाधान है कि मेरी राय में थोड़ा क्लीनर मिला है:

 #in forms.py class UserForm(forms.ModelForm): class Meta: model = User fields = ["username", "email"] class UserProfileForm(forms.ModelForm): class Meta: model = UserProfile #in views.py def add_user(request): ... if request.method == "POST": uform = UserForm(data = request.POST) pform = UserProfileForm(data = request.POST) if uform.is_valid() and pform.is_valid(): user = uform.save() profile = pform.save(commit = False) profile.user = user profile.save() .... ... #in template <form method="post"> {{ uform.as_p }} {{ pform.as_p }} <input type="submit" ...> </form> 

स्रोत

मैं अंततः कैसे किया है:

 class UserProfileForm(forms.ModelForm): first_name = forms.CharField(label=_(u'Prénom'), max_length=30) last_name = forms.CharField(label=_(u'Nom'), max_length=30) def __init__(self, *args, **kw): super(UserProfileForm, self).__init__(*args, **kw) self.fields['first_name'].initial = self.instance.user.first_name self.fields['last_name'].initial = self.instance.user.last_name self.fields.keyOrder = [ 'first_name', 'last_name', ...some_other... ] def save(self, *args, **kw): super(UserProfileForm, self).save(*args, **kw) self.instance.user.first_name = self.cleaned_data.get('first_name') self.instance.user.last_name = self.cleaned_data.get('last_name') self.instance.user.save() class Meta: model = UserProfile 

इस तरह मैं इसे वर्तमान ट्रंक में किया (संशोधन: 11804)। Natim का समाधान मेरे लिए काम नहीं कर रहा था

admin.py :

 class ProfileAdmin(admin.ModelAdmin): form = ProfileForm def save_model(self, request, obj, form, change): obj.user.first_name = form.cleaned_data['first_name'] obj.user.last_name = form.cleaned_data['last_name'] obj.user.save() obj.save() 

forms.py :

 class ProfileForm(forms.ModelForm): first_name = forms.CharField(max_length=256) last_name = forms.CharField(max_length=256) def __init__(self, *args, **kwargs): super(ProfileForm, self).__init__(*args, **kwargs) try: self.fields['first_name'].initial = self.instance.user.first_name self.fields['last_name'].initial = self.instance.user.last_name except User.DoesNotExist: pass class Meta: fields = ['first_name', 'last_name', ...etc.] 

आप डीजेंगो-बेसिक-ऐप प्रोजेक्ट का उपयोग करने का भी प्रयास कर सकते हैं, जिसमें प्रोफाइल ऐप है:

https://github.com/nathanborror/django-basic-apps

यह एक ऐसी चीज है जो मैं अपनी परियोजनाओं में एक लंबे समय तक इस्तेमाल करता हूं, उम्मीद है कि इस समस्या को दूर करने में दूसरों की मदद करनी चाहिए।

 class SignUpForm(forms.ModelForm): first_name = forms.CharField(max_length = 30) last_name = forms.CharField(max_length = 30) username = forms.CharField(max_length = 30) password = forms.CharField(widget = forms.PasswordInput) password1 = forms.CharField(widget = forms.PasswordInput) class Meta: model = UserProfile exclude = ['user'] def clean_username(self): # check if username does not exist before try: User.objects.get(username=self.cleaned_data['username']) #get user from user model except User.DoesNotExist : return self.cleaned_data['username'] raise forms.ValidationError("This user exist already choose an0ther username") def clean(self, *args , **kwargs): super(SignUpForm).clean(*args ,**kwargs) # check if password 1 and password2 match each other if 'password1' in self.cleaned_data and 'password2' in self.cleaned_data:#check if both pass first validation if self.cleaned_data['password1'] != self.cleaned_data['password2']: # check if they match each other raise forms.ValidationError("Passwords don't match each other") return self.cleaned_data def save(self): # create new user new_user = User.objects.create_user(username=self.cleaned_data['username'],password=self.cleaned_data['password1'],email=self.cleaned_data['email']) new_user.first_name = self.cleaned_data['first_name'] new_user.last_name = self.cleaned_data['last_name'] new_user.save() UserProf = super(SignUpForm,self).save(commit = False) UserProf.user = new_user UserProf.save() return UserProf 

मैं इसे सामान्य मानता हूं कि आपको डॉक्स में कोई जानकारी नहीं मिलती है क्योंकि आप दो मॉडल को एक ही रूप में मर्ज करते हैं।

वैकल्पिक रूप से और शायद बहुत स्पष्ट रूप से आप कर सकते हैं: दो मॉडल स्वरूप, उपयोगकर्ता के लिए एक और अन्य userprofile के लिए। केवल प्रथम नाम और अंतिम नाम प्रदर्शित करने के लिए userprofile modelform को सेट करें एक ही रूप में एक ही टेम्पलेट में दोनों रूपों को एक <form> टैग में रखें जब यह सबमिट किया जाता है, तो प्रत्येक प्रपत्र के सहेजे तरीकों को कॉल करें।

क्यों बैक-एंड पर दो मॉडल फॉर्म नहीं होते हैं और सिर्फ उन्हें अपने टेम्पलेट में एक रूप के रूप में प्रस्तुत करते हैं? अपने UserProfileForm से नाम फ़ील्ड ड्रॉप करें और उपयोगकर्ता ऑब्जेक्ट के लिए दूसरा मॉडल फ़ॉर्म बनाएं?