Python——文件上傳

_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>
複製代碼
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章