python - 无法在 django 中更新用户个人资料图片
问题描述
我想允许用户上传个人资料并将上传的个人资料更新为用户的新个人资料图片。
我尝试按照我在 YouTube 上找到的教程并在 stackoverflow 上阅读了一些答案,但仍在苦苦挣扎。
这就是我在 forms.py 中的内容:
# edit mentor profile
class MentorProfileForm(forms.ModelForm):
class Meta:
model = User
exclude = ('password',)
def clean_avatar(self):
avatar = self.cleaned_data['avatar']
try:
w,h = get_image_dimensions(avatar)
#validate size
max_width = max_height = 100
if w > max_width or h > max_height:
raise forms.ValidationError(
u'Please use an image that is '
'%s x %s pixels or smaller.' %(max_width,max_height))
#validate content type
main, sub = avatar.content_type.split('/')
if not (main == 'image' and sub in ['jpeg','pjpeg','gif','png']):
raise forms.ValidationError(u'Please use a JPEG, '
'GIF or PNG image.')
#validate file size
if len(avatar) > (20 * 1024):
raise forms.ValidationError(
u'Image file must not exceed 20k.'
)
except AttributeError:
pass
return avatar
这里的想法是允许用户仅上传特定大小的图像,因此我不必调整个人资料图片的大小
模型.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,upload_to='media')
def __str__(self):
return "Profile of user {}".format(self.user.username)
意见.py(教师.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.email = form.cleaned_data['email']
user.mentor.avatar = form.cleaned_data['avatar']
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})
和我的html页面:
<form id="edit-mentor-profile" class="form-horizontal" method="post" enctype="multipart/form-data">
{% 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">
<img id="image" style="width:99%;height:99%;">
</div>
</div>
<div class="media-body">
<input type="file" id="files" class="btn btn-white btn-sm paper-shadow relative" data-z="0.5" data-hover-z="1" data-animated/>
</div>
...
这是个人资料图片应显示的位置
<img src="{{ user.mentor.avatar}}" alt="people" class="img-circle width-80" />
问题是当我单击保存更改时,我没有更新个人资料图片(其他所有内容都已更新)
更新
我还尝试创建两种表单,一种从用户模型继承,另一种通过添加照片字段来扩展它
然后,我在编辑它们时将这两个表单保存在我的 views.py 中,但现在没有任何内容被保存
这是我在 views.py(teachers.py) 中的内容:
# edit mentor profile
def edit_user(request):
user = request.user
# form = MentorProfileForm(instance=user)
if request.method == 'POST':
form = UserForm(request.POST, instance=user)
mentorform = MentorProfileForm(request.POST, request.FILES, instance=user)
if form.is_valid() and mentorform.is_valid():
form.save()
mentorform.save()
messages.success(request, _('Your profile was successfully updated!'))
return HttpResponseRedirect('%s' % (reverse('profile')))
else:
messages.error(request, _('Please correct the error below.'))
else:
form = UserForm(request.POST, instance=user)
mentorform = MentorProfileForm(request.POST, request.FILES, instance=user)
return render(request, 'classroom/teachers/app-instructor-profile.html', {'form': form,
'mentor_form': mentorform})
表格.py:
#basic form
class UserForm(forms.ModelForm):
class Meta:
model = User
fields = ('first_name','last_name','email')
# edit mentor profile
class MentorProfileForm(forms.ModelForm):
class Meta:
model = Mentor
fields = ('photo',)
编辑照片和个人资料信息的表格:
<form id="edit-mentor-profile" class="form-horizontal" method="post" enctype="multipart/form-data">
{% 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">
<img id="image" style="width:99%;height:99%;">
</div>
</div>
<div class="media-body">
<input type="file" id="files" class="btn btn-white btn-sm paper-shadow relative" data-z="0.5" data-hover-z="1" data-animated/>
</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>
以及照片应该出现的位置
<img src="{{ mentorform.photo}}" alt="people" class="img-circle width-80" />
使用这种更新的方法,我收到错误消息
messages.success(request, _('Your profile was successfully updated!')) NameError: name '_' is not defined
解决方案
请注意,您必须先保存对象,然后才能将其分配给一对一关系,适用于更新,在teachers.py
分配头像后保存实例。
mentor = user.mentor
mentor.avatar = form.cleaned_data['avatar']
mentor.save()
user.save()
并将文件从请求传递到表单。
form = MentorProfileForm(request.POST, request.FILES, instance=user)