8

Tôi có biểu mẫu đăng ký tùy chỉnh để người dùng thêm hồ sơ trên ứng dụng của mình. Tuy nhiên, một lỗi gần đây đã xuất hiện ở chỗ biểu mẫu không lưu thông tin được đưa vào tất cả các trường.Biểu mẫu Django với mối quan hệ nhiều-nhiều không tiết kiệm

Mẫu người dùng của tôi, MyUser có mối quan hệ ManyToMany với một mô hình khác, Interest và đây là nơi các sự cố phát sinh. Tôi không chắc chắn nếu đó là chế độ xem RegistrationForm hoặc chế độ xem register gây ra điều đó, vì vậy tôi đã bao gồm cả bên dưới, cũng như mã mô hình. Tôi cũng có một cái nhìn cho người dùng cập nhật hồ sơ của họ, cũng bao gồm, một khi nó được tạo ra, và điều này đang làm việc hoàn toàn hoàn hảo. Đây là chế độ xem personal. Như tôi đã nói, chỉ có trường Interest không được trả lại, mặc dù nó đang được điền vào trang đăng ký.

Bất kỳ trợ giúp hoặc lời khuyên nào được đánh giá cao, cảm ơn.

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 

Trả lời

17

Vì bạn sử dụng commit=false cho cuộc gọi super(RegistrationForm, self).save, nó không lưu trường nhiều đến nhiều. Do đó, bạn cần phải thêm self.save_m2m() sau user.save() trong phương thức save() của mình là RegistrationForm.

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

EDIT: save_m2m() là trên mẫu, không phải là mẫu

+0

Thank-you. Tôi mất 3 giờ trên 'tính năng' này. –

+0

lên cho 'save_m2m() có trên Biểu mẫu' :) – cutteeth

Các vấn đề liên quan