我一直在尝试创建一个表单,该表单将允许用户编辑保存在其个人资料中的某些信息。
我目前遇到的问题是,当用户填写并保存表格时,其个人资料中的信息不会根据他们填写的值进行更新。
我尝试阅读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')
models.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的内容后,我尝试尽我所能对我的form.py进行一些更改
forms.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)
和Teachers.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})
答案 0 :(得分:2)
问题可能在这里:
class MentorProfileForm(forms.Form): #<-- Here
class Meta(TeacherSignUpForm.Meta):
model = User
exclude = ('password')
forms.Form
没有保存功能,因为您需要从MentorProfileForm
继承forms.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()
答案 1 :(得分:1)
更新任何模型实例时,您都需要传递“实例”。将您的视图更改为此:
# edit mentor profile
def edit_user(request):
user = request.user
form = MentorProfileForm(instance=user)
if request.method == 'POST':
form = MentorProfileForm(request.POST, 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})