首页 > 解决方案 > 无法更新用户个人资料信息

问题描述

我一直在尝试创建一个表单,允许用户编辑他们个人资料中保存的一些信息。

我目前遇到的问题是,当用户填写并保存表单时,他们的个人资料中的信息不会根据他们填写的值进行更新。

我曾尝试通读 Django 中有关表单的文档,但仍在努力解决这个问题。

这是我在 forms.py 中的代码:

#mentor sign up form
class TeacherSignUpForm(UserCreationForm):
    email = forms.EmailField(max_length=100)
    first_name = forms.CharField(max_length=100)
    last_name = forms.CharField(max_length=100)
    linkedin = forms.URLField(max_length=200)

    class Meta(UserCreationForm.Meta):
        model = User
        fields = ('email', 'username', 'first_name', 'last_name')

    def save(self, commit=True):
        self.instance.is_teacher = True
        user = super(UserCreationForm, self).save(commit=False)
        user.email = self.cleaned_data['email']
        user.first_name = self.cleaned_data['first_name']
        user.last_name = self.cleaned_data['last_name']
        user.save()
        mentor = Mentor.objects.create(
            user=user,
            linkedin=self.cleaned_data['linkedin']
        )
        return user


# edit mentor profile
class MentorProfileForm(forms.Form):
    class Meta(TeacherSignUpForm.Meta):
        model = User
        exclude = ('password')

模型.py

class User(AbstractUser):
    is_student = models.BooleanField(default=False)
    is_teacher = models.BooleanField(default=False)
...
class Mentor(models.Model):
    user = models.OneToOneField(User,on_delete=models.CASCADE,primary_key=True)
    linkedin = models.URLField(max_length=200,null=True,blank=True)
    photo = models.ImageField(null=True,blank=True)

    def __str__(self):
        return "Profile of user {}".format(self.user.username)

@receiver(post_save,sender=User)
def create_or_update(sender, instance,created, **kwargs):
    if created:
        Mentor.objects.get_or_create(user=instance)
        post_save.connect(create_or_update, sender=User)

Teachers.py - 这相当于 views.py - 特定于导师/教师简介:

# edit mentor profile
def edit_user(request):
    user = request.user
    form = MentorProfileForm(initial={'first_name': user.first_name, 'last_name': user.last_name, 'email': user.email})
    if request.method == 'POST':
        if form.is_valid():
            user.first_name = MentorProfileForm(request.POST['first_name'])
            user.last_name = MentorProfileForm(request.POST['last_name'])
            user.email = MentorProfileForm(request.POST['email'])
            # user.password = request.POST['password']
            form.save(commit=True)
            return HttpResponseRedirect('%s' % (reverse('profile')))
        else:
            form = MentorProfileForm()
    return render(request, 'classroom/teachers/app-instructor-profile.html', {'form': form})

这是我在表单中使用的模板

<form id="edit-mentor-profile" class="form-horizontal" method="post" >
                        {% csrf_token %}
                      <div class="form-group">
                        <label for="photo" class="col-sm-2 control-label">Avatar</label>
                        <div class="col-md-6">
                          <div class="media v-middle">
                            <div class="media-left">
                              <div class="icon-block width-100 bg-grey-100">
                                <i class="fa fa-photo text-light"></i>
                              </div>
                            </div>
                            <div class="media-body">
                              <a href="#" class="btn btn-white btn-sm paper-shadow relative" data-z="0.5" data-hover-z="1" data-animated> Add Image<i class="fa fa-upl"></i></a>
                            </div>
                          </div>
                        </div>
                      </div>
                      <div class="form-group">
                        <label for="inputEmail3" class="col-md-2 control-label">Full Name</label>
                        <div class="col-md-8">
                          <div class="row">
                            <div class="col-md-6">
                              <div class="form-control-material">
                                {{ form.first_name }}
                                <label for="edit-mentor-profile-first_name"></label>
                              </div>
                            </div>
                            <div class="col-md-6">
                              <div class="form-control-material">
                                {{ form.last_name }}
                                <label for="edit-mentor-profile-last_name"></label>
                              </div>
                            </div>
                          </div>
                        </div>
                      </div>
                      <div class="form-group">
                        <label for="email" class="col-md-2 control-label">Email</label>
                        <div class="col-md-6">
                          <div class="form-control-material">
                            <div class="input-group">
                              <span class="input-group-addon"><i class="fa fa-envelope"></i></span>
                              {{ form.email }}
                              <label for="edit-mentor-profile-email"></label>
                            </div>
                          </div>
                        </div>
                      </div>
                      <div class="form-group">
                        <div class="col-md-offset-2 col-md-6">
                          <div class="checkbox checkbox-success">
                            <input id="checkbox3" type="checkbox" checked="">
                            <label for="checkbox3">Subscribe to our Newsletter</label>
                          </div>
                        </div>
                      </div>
                      <div class="form-group margin-none">
                        <div class="col-md-offset-2 col-md-10">
                          <button type="submit" class="btn btn-primary paper-shadow relative" data-z="0.5" data-hover-z="1" data-animated>Save Changes</button>
                        </div>
                      </div>
                    </form>

重申一下,我可以查看表单,对其进行编辑,但是当我尝试保存值时,什么都没有保存并且页面刷新

更新

在阅读了有关 ModelForm 之后,我尝试尽我所能对我的 forms.py 进行一些更改

表格.py

class MentorProfileForm(forms.ModelForm):
    class Meta:
        model = User
        exclude = ('password',)

基于给出的答案之一,我还对 models.py 进行了更改

@receiver(post_save,sender=User)
def create_or_update(sender, instance,created, **kwargs):
    if created:
        post_save.connect(create_or_update, sender=User)

和教师.py(视图):

# edit mentor profile
def edit_user(request):
    user = request.user
    form = MentorProfileForm(instance=user)
    if request.method == 'POST':
        form = MentorProfileForm(request.POST or None, instance=user)
        if form.is_valid():
            user.first_name = form.cleaned_data['first_name']
            user.last_name = form.cleaned_data['last_name']
            user.email = form.cleaned_data['email']
            # user.password = request.POST['password']
            form.save(commit=True)
            return HttpResponseRedirect('%s' % (reverse('profile')))
        else:
            return render(request, 'classroom/teachers/app-instructor-profile.html', {'form': form,
                                                                                      'errors': form.errors})
    return render(request, 'classroom/teachers/app-instructor-profile.html', {'form': form})

标签: pythondjangodjango-modelsdjango-formsdjango-views

解决方案


大概问题就出在这里:

class MentorProfileForm(forms.Form):  #<-- Here
    class Meta(TeacherSignUpForm.Meta):
        model = User
        exclude = ('password')

没有保存功能forms.Form,因为您需要MentorProfileFormforms.ModelForm. 或者在您的情况下,TeacherSignUpForm(当您覆盖它的 Meta 类时)。

另外,我也对这部分感到困惑:

def save(self, commit=True):
      ....
      # this section
      mentor = Mentor.objects.create(
            user=user,
            linkedin=self.cleaned_data['linkedin']
      )
      return user

因为,你有一个保存后的信号来创建 Mentor,那你为什么要使用它呢?如果您删除后保存信号并在此处使用 get_or_create 会更好,即:

  _, mentor = Mentor.objects.get_or_create(
        user=user,
        linkedin=self.cleaned_data.get('linkedin')
  )

最后,更新视图:

form = MentorProfileForm(request.POST or None, instance=user)
if request.method == 'POST':
    if form.is_valid():
        user = form.save()

推荐阅读