[英]Editing profile in django
我想弄清楚如何从自定义 html 表单编辑和更新配置文件。 我看过有关如何使用UserChangeForm
潜在地从 Django 的内置更改表单继承字段并使用它更改配置文件的教程。 但我宁愿使用我正在使用的模板附带的 html 页面。
这是个人资料页面的 html 文件:
...
<li><a href={% url editprofile %}>Edit Profile</a></li>
...
用于编辑个人资料页面的模板的 html
<form class="form-horizontal" action="app-instructor-profile.html" method="post" >
<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">
<input type="text" class="form-control" id="first_name" placeholder= {{ user.first_name }}>
<label for="first_name">First name</label>
</div>
</div>
<div class="col-md-6">
<div class="form-control-material">
<input type="text" class="form-control" id="last_name" placeholder={{ user.last_name }}>
<label for="last_name">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>
<input type="email" class="form-control" id="email" placeholder={{ user.email }}>
<label for="inputEmail3">Email address</label>
</div>
</div>
</div>
</div>
<div class="form-group">
<label for="inputPassword3" class="col-md-2 control-label">Change Password</label>
<div class="col-md-6">
<div class="form-control-material">
<input type="password" class="form-control" id="password" placeholder="Password">
<label for="inputPassword3">Password</label>
</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>
教师.py(视图)
@method_decorator([login_required, teacher_required], name='dispatch')
def edit_user(request,pk):
user = User.objects.get(pk=pk)
form = MentorProfileForm(instance=user)
if request.user.is_authenticated() and request.user.id == user.id:
if request.method == 'POST':
form = MentorProfileForm(request.POST, request.FILES, instance=profile)
if form.is_valid():
update = form.save(commit=False)
update.user = user
update.save()
return HttpResponse('Confirm')
else:
form = MentorProfileForm(instance=profile)
return render(request, 'teachers:app-student-profile', {'form':form})
表格.py
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(ModelForm):
class Meta:
model = Mentor
exclude = ['user']
和模型.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.create(user=instance)
instance.profile.save()
我希望登录的用户单击编辑个人资料,重定向到 html 模板以编辑个人资料页面并根据所做的更改更新他们的信息。 但是,当我运行我的代码时,我收到此错误消息
“用户”对象没有“个人资料”属性
更新对 stackoverflow 进行了一些研究并对我的代码进行了一些更改
教师.py(视图)
#edit mentor profile
def edit_user(request,pk):
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 = request.POST['first_name']
user.last_name = request.POST['last_name']
user.email = request.POST['email']
user.save()
return HttpResponseRedirect('%s'%(reverse('profile')))
context = {
"form":form
}
return render(request, "teachers:app-instructor-profile",context)
网址.py
path('teachers/', include(([
path('edit_user', teachers.edit_user, name='edit_user'),
], 'classroom'), namespace='teachers')),
但是,我仍然收到相同的错误消息
“用户”对象没有“个人资料”属性
您提到的错误很可能是由您的create_or_update
信号引起的。 线
instance.profile.save()
正在尝试对您的User
实例的某些profile
属性调用save()
。 但是,您发布的User
模型没有显示任何名为profile
属性。 我不确定你想用那条线实现什么。 如果我正确理解您的代码,您将在创建新用户时尝试创建关联的Mentor
。 为此,您不需要该线并可以将其取出。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.