图片已上传但未保存在媒体和数据库 Django 中
Image uploaded but not saved in media and database Django
我正在创建一个设置页面,用户应该可以在其中更改图像和生物数据。但是当我打印 request.FILES.GET("profile_picture") 时,只有生物数据会更新,它会打印我上传的照片的名称。为什么没有上传保存到数据库?
Models.py
from django.db import models
from django.contrib.auth.models import AbstractUser
class User(AbstractUser):
profile_pic = models.ImageField(upload_to="images/", null=True ,blank=True)
bio = models.TextField(max_length=100, blank=True)
forms.py
class ProfileForm(forms.Form):
profile_picture = forms.ImageField(required=False )
bio = forms.CharField(label='Bio', max_length=100 ,widget=forms.Textarea())
views.py
def settings(request):
if request.user.is_authenticated:
intial_data = {
'first_name': request.user.first_name,
'last_name': request.user.last_name,
'user_name': request.user.username,
'email':request.user.email,
'bio':request.user.bio
}
profile_form=ProfileForm(intial_data)
if request.method == "POST":
profile_form=ProfileForm(request.POST, request.FILES)
if profile_form.is_valid():
user_name = profile_form.cleaned_data.get('user_name')
profile_picture =request.FILES.get('profile_picture')
bio = profile_form.cleaned_data.get('bio')
user= User.objects.get(pk=request.user.id)
if user is not None:
user.profile_picture=profile_picture
user.bio=bio
user.save()
context ={
"profile_form":profile_form
}
return render(request, 'user/settings.html',context)
return redirect('home')
my_template.html
<tr>
<td>Bio</td>
<td>{{profile_form.bio}}</td>
</tr>
<tr>
<td>Update Profile Picture</td>
<td>{{profile_form.profile_picture}}</td>
</tr>
行中有尾随逗号:
# trailing comma ↓
user.profile_picture=profile_picture,
你需要删除它。
也就是说,我建议使用 ModelForm
,这可以删除很多样板代码:
class ProfileForm(forms.Form):
class Meta:
model = User
fields = ['profile_pic', 'bio']
labels = {
'profile_pic': 'Profile picture'
}
widgets = {
'bio': forms.Textarea
}
那么在视图中,我们可以使用:
from django.contrib.auth.decorators import login_required
@login_required
def settings(request):
if request.method == 'POST':
profile_form = ProfileForm(request.POST, request.FILES, instance=request.user)
if profile_form.is_valid():
profile_form.save()
return redirect('home')
else:
profile_form = ProfileForm(instance=request.user)
context ={
'profile_form': profile_form
}
return render(request, 'user/settings.html', context)
我正在创建一个设置页面,用户应该可以在其中更改图像和生物数据。但是当我打印 request.FILES.GET("profile_picture") 时,只有生物数据会更新,它会打印我上传的照片的名称。为什么没有上传保存到数据库?
Models.py
from django.db import models
from django.contrib.auth.models import AbstractUser
class User(AbstractUser):
profile_pic = models.ImageField(upload_to="images/", null=True ,blank=True)
bio = models.TextField(max_length=100, blank=True)
forms.py
class ProfileForm(forms.Form):
profile_picture = forms.ImageField(required=False )
bio = forms.CharField(label='Bio', max_length=100 ,widget=forms.Textarea())
views.py
def settings(request):
if request.user.is_authenticated:
intial_data = {
'first_name': request.user.first_name,
'last_name': request.user.last_name,
'user_name': request.user.username,
'email':request.user.email,
'bio':request.user.bio
}
profile_form=ProfileForm(intial_data)
if request.method == "POST":
profile_form=ProfileForm(request.POST, request.FILES)
if profile_form.is_valid():
user_name = profile_form.cleaned_data.get('user_name')
profile_picture =request.FILES.get('profile_picture')
bio = profile_form.cleaned_data.get('bio')
user= User.objects.get(pk=request.user.id)
if user is not None:
user.profile_picture=profile_picture
user.bio=bio
user.save()
context ={
"profile_form":profile_form
}
return render(request, 'user/settings.html',context)
return redirect('home')
my_template.html
<tr>
<td>Bio</td>
<td>{{profile_form.bio}}</td>
</tr>
<tr>
<td>Update Profile Picture</td>
<td>{{profile_form.profile_picture}}</td>
</tr>
行中有尾随逗号:
# trailing comma ↓
user.profile_picture=profile_picture,
你需要删除它。
也就是说,我建议使用 ModelForm
,这可以删除很多样板代码:
class ProfileForm(forms.Form):
class Meta:
model = User
fields = ['profile_pic', 'bio']
labels = {
'profile_pic': 'Profile picture'
}
widgets = {
'bio': forms.Textarea
}
那么在视图中,我们可以使用:
from django.contrib.auth.decorators import login_required
@login_required
def settings(request):
if request.method == 'POST':
profile_form = ProfileForm(request.POST, request.FILES, instance=request.user)
if profile_form.is_valid():
profile_form.save()
return redirect('home')
else:
profile_form = ProfileForm(instance=request.user)
context ={
'profile_form': profile_form
}
return render(request, 'user/settings.html', context)