_1、原始方法:
表單設置enctype="multipart/form-data"
在視圖中通過request.FILES來獲取文件對象
將文件保存到磁盤
def uploaded_file(f):
""" 保存文件 """
with open('media/file/name.jpg', 'wb+') as dest:
for chunk in f.chunks():
dest.write(chunk)
weibo/urls.py
# 文件上傳
path('file/upload/origin/', views.file_upload_origin, name='file_upload_origin')
weibo/views.py
def file_upload_origin(request):
""" 原始的文件上傳 """
if request.method == 'POST':
# 獲取上傳的文件對象,二進制
file = request.FILES.get('avatar', None)
filename = os.path.join(settings.MEDIA_ROOT, 'test.jpg')
with open(filename, 'wb+') as f:
for chunk in file.chunks():
f.write(chunk)
print('上傳成功')
return render(request, 'file_upload_origin.html')
weibo/templates/file_upload_origin.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>原始的文件上傳</title>
</head>
<body>
<form action="." method="post" enctype="multipart/form-data">
<input type="file" name="avatar">
<input type="submit" value="開始上傳">
</form>
</body>
</html>
_2、結合ORM模型方法:
weibo/urls.py
# ORM模型文件上傳
path('file/upload/form/', views.file_upload_forms, name='file_upload_forms')
weibo/forms.py
class AvatarUploadForm(forms.Form):
""" 頭像上傳Form """
remark = forms.CharField(label='備註', max_length=32)
avatar = forms.ImageField(label='頭像')
weibo/views.py
def file_upload_forms(request):
""" ORM模型文件上傳 """
if request.method == 'POST':
form = AvatarUploadForm(request.POST, request.FILES)
if form.is_valid():
# 保存備註
# 保存圖片
file = request.FILES.get('avatar', None)
filename = os.path.join(settings.MEDIA_ROOT, 'test.jpg')
with open(filename, 'wb+') as f:
for chunk in file.chunks():
f.write(chunk)
print('上傳成功')
else:
form = AvatarUploadForm()
return render(request, 'file_upload_forms.html', {
'form': form
})
weibo/templates/file_upload_forms.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>ORM模型文件上傳</title>
</head>
<body>
<form action="." method="post" enctype="multipart/form-data">
{{ form.as_p }}
<input type="submit" value="上傳">
</form>
</body>
</html>
_3、結合ORM模型上傳
表單設置enctype="multipart/form-data"
在模型中使用models.ImageField
在表單中使用forms.ImageField
weibo/forms.py
class WeiboImageForm(forms.ModelForm):
""" 微博圖片上傳 """
content = forms.CharField(label='微博內容', max_length=256, widget=forms.Textarea(attrs={
'placeholder': '請輸入微博內容',
}))
class Meta:
model = WeiboImage
fields = ['image']
# def clean_content(self):
# pass
def save(self, user, commit=False):
# 先不保存到數據庫,先得到對象,接下來對這個對象進行修改,然後再保存
obj = super().save(commit)
data = self.cleaned_data
content = data['content']
# 1、創建微博的記錄
weibo = Weibo.objects.create(user=user, content=content)
# 2、修改微博關聯關係
obj.weibo = weibo
obj.save()
return obj
weibo/urls.py
path('file/upload/weibo/', views.file_upload_weibo, name='file_upload_weibo'),
weibo/views.py
def file_upload_weibo(request):
""" 發表帶圖片的微博 """
# 因爲沒有登錄,默認用戶來進行微博的發佈
user = WeiboUser.objects.get(pk=1)
if request.method == 'POST':
form = WeiboImageForm(request.POST, request.FILES)
if form.is_valid():
obj = form.save(user,False)
print('保存成功', obj.pk)
else:
form = WeiboImageForm()
return render(request, 'file_upload_weibo.html', {
'form': form
})
weibo/templates/file_upload_weibo.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>結合ORM模型上傳——發佈帶圖片的微博</title>
</head>
<body>
<h3>微博發佈</h3>
<form action="." method="post" enctype="multipart/form-data">
{{ form.as_p }}
<input type="submit" value="發佈微博">
</form>
</body>
</html>