8

Ich habe ein benutzerdefiniertes Registrierungsformular für meine Benutzer, um ein Profil in meiner App hinzuzufügen. In letzter Zeit ist jedoch ein Fehler aufgetreten, da das Formular die Informationen nicht speichert, die in alle Felder eingegeben werden.Django-Formular mit Viele-zu-Viele-Beziehung speichert nicht

Mein Benutzermodell MyUser hat eine ManyToMany-Beziehung mit einem anderen Modell, Interest, und hier treten die Probleme auf. Ich bin nicht sicher, ob es die RegistrationForm oder die register Ansicht ist, die es verursacht, also habe ich sowohl unten, als auch den Modellcode eingeschlossen. Ich habe auch eine Ansicht für die Benutzer, um ihr Profil zu aktualisieren, auch enthalten, sobald es erstellt wird, und das funktioniert absolut perfekt. Dies ist die personal Ansicht. Wie ich sage, wird nur das Interest Feld nicht zurückgegeben, obwohl es auf der Registrierungsseite ausgefüllt wird.

Jede Hilfe oder Beratung wird sehr geschätzt, danke.

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 

Antwort

17

Da Sieverwendenfür den super(RegistrationForm, self).save Aufruf, speichert es das Viele-zu-Viele-Feld nicht. Sie müssen daher self.save_m2m() nach user.save() in Ihrer save() Methode von RegistrationForm hinzufügen.

Siehe https://docs.djangoproject.com/en/dev/topics/forms/modelforms/#the-save-method

EDIT: save_m2m() auf dem Formular ist, nicht das Modell

+0

Dankes-. Ich habe 3 Stunden bei diesem "Feature" verloren. –

+0

up für 'save_m2m() ist auf dem Formular' :) – cutteeth

Verwandte Themen