8

को सहेजता नहीं है मेरे पास मेरे उपयोगकर्ताओं के लिए मेरे ऐप पर प्रोफ़ाइल जोड़ने के लिए एक कस्टम पंजीकरण फ़ॉर्म है। हालांकि, हाल ही में एक बग पॉप अप हो गया है कि यह फॉर्म सभी क्षेत्रों में दी गई जानकारी को सहेज नहीं रहा है।कई से अधिक रिश्तों के साथ Django फॉर्म

मेरा उपयोगकर्ता मॉडल, MyUser में अन्य मॉडल, Interest के साथ कई सारे रिश्ते हैं, और यही वह समस्या है जहां समस्याएं उत्पन्न हो रही हैं। मुझे यकीन नहीं है कि यह RegistrationForm है या register देखें जो इसे उत्पन्न कर रहा है, इसलिए मैंने नीचे दोनों के साथ-साथ मॉडल कोड भी शामिल किया है। मेरे पास उपयोगकर्ताओं के प्रोफ़ाइल को अपडेट करने के लिए भी एक दृश्य है, इसे शामिल करने के बाद भी शामिल है, और यह बिल्कुल पूरी तरह से काम कर रहा है। यह personal व्यू है। जैसा कि मैंने कहा है, यह केवल Interest फ़ील्ड है जो वापस नहीं किया जा रहा है, भले ही इसे पंजीकरण पृष्ठ पर भर दिया जा रहा हो।

कोई भी मदद या सलाह बहुत सराहना की है, धन्यवाद।

models.py

class Interest(models.Model): 
    title = models.TextField() 

    def __unicode__(self): 
     return self.title 

class MyUser(AbstractBaseUser): 
    email = models.EmailField(
         verbose_name='email address', 
         max_length=255, 
         unique=True, 
        ) 
    first_name = models.CharField(max_length=30) 
    last_name = models.CharField(max_length=40) 
    date_of_birth = models.DateField() 
    course = models.ForeignKey(Course, null=True) 
    location = models.ForeignKey(Location, null=True) 
    interests = models.ManyToManyField(Interest, null=True) 
    bio = models.TextField(blank=True) 
    is_active = models.BooleanField(default=True) 
    is_admin = models.BooleanField(default=False) 

    objects = MyUserManager() 

    USERNAME_FIELD = 'email' 
    REQUIRED_FIELDS = ['date_of_birth'] 

views.py

def register(request): 
    if request.method == 'POST': 
     form = RegistrationForm(data=request.POST) 
     if form.is_valid(): 
      form.save() 
      return redirect('/friends/home/') 
    else: 
     form = RegistrationForm() 

    template = "adduser.html" 
    data = { 'form': form, } 
    return render_to_response(template, data, context_instance=RequestContext(request)) 

@login_required(login_url='/friends/login/') 
def personal(request): 
    """ 
    Personal data of the user profile 
    """ 
    profile = request.user 

    if request.method == "POST": 
     form = ProfileForm(request.POST, instance=profile) 
     if form.is_valid(): 
      form.save() 
      messages.add_message(request, messages.INFO, _("Your profile information has been updated successfully.")) 
      return redirect('/friends/success/') 
    else: 
     form = ProfileForm(instance=profile) 

    template = "update_profile.html" 
    data = { 'section': 'personal', 'form': form, } 
    return render_to_response(template, data, context_instance=RequestContext(request)) 

forms.py

class RegistrationForm(forms.ModelForm): 
    """ 
    Form for registering a new account. 
    """ 
    email = forms.EmailField(widget=forms.TextInput, label="Email") 
    password1 = forms.CharField(widget=forms.PasswordInput, 
           label="Password") 
    password2 = forms.CharField(widget=forms.PasswordInput, 
           label="Password (again)") 
    course = forms.ModelChoiceField(queryset=Course.objects.order_by('title')) 
    location = forms.ModelChoiceField(queryset=Location.objects.order_by('location')) 

    class Meta: 
     model = MyUser 
     fields = [ 
      'first_name', 
      'last_name', 
      'date_of_birth', 
      'email', 
      'password1', 
      'password2', 
      'course', 
      'location', 
      'interests', 
      'bio', 
      ] 

    def __init__(self, *args, **kwargs):#Sort interests alphabetically 
     super(RegistrationForm, self).__init__(*args, **kwargs) 
     self.fields['interests'].queryset = Interest.objects.order_by('title') 

    def clean(self): 
     cleaned_data = super(RegistrationForm, self).clean() 
     if 'password1' in self.cleaned_data and 'password2' in self.cleaned_data: 
      if self.cleaned_data['password1'] != self.cleaned_data['password2']: 
       raise forms.ValidationError("Passwords don't match. Please enter again.") 
     return self.cleaned_data 

    def save(self, commit=True): 
     user = super(RegistrationForm, self).save(commit=False) 
     user.set_password(self.cleaned_data['password1']) 
     if commit: 
      user.save() 
     return user 

उत्तर

17

जब से तुमका उपयोग super(RegistrationForm, self).save कॉल के लिए, यह कई से अधिक फ़ील्ड को सहेजता नहीं है। इसलिए आपको user.save()RegistrationForm की save() विधि में self.save_m2m() जोड़ने की आवश्यकता है।

देखें https://docs.djangoproject.com/en/dev/topics/forms/modelforms/#the-save-method

संपादित करें: save_m2m() फार्म पर है, नहीं मॉडल

+0

धन्यवाद। मैंने इस 'फीचर' पर 3 घंटे खो दिए। 'Save_m2m() के लिए –

+0

फॉर्म पर है :) – cutteeth

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