django 简单文件上传

通过模型来处理上传的文件

如果想要在 FileField 上的 Model 保存文件,使用 ModelForm 会让这一过程变得简单。当调用 form.save() 时,文件对象将会被保存在对相应 FileField 的 upload_to 参数所指定的地方:

from django.http import HttpResponseRedirect
from django.shortcuts import render
from .forms import ModelFormWithFileField


def upload_file(request):
    if request.method == "POST":
        form = ModelFormWithFileField(request.POST, request.FILES)
        if form.is_valid():
            # file is saved
            form.save()
            return HttpResponseRedirect("/success/url/")
    else:
        form = ModelFormWithFileField()
    return render(request, "upload.html", {"form": form})

参考: https://docs.djangoproject.com/zh-hans/4.2/topics/http/file-uploads/

实例使用:

@login_required
def upload_book(request):
    user = request.user
    if request.method == 'POST':
        form = BookForm(request.POST, request.FILES)
        if form.is_valid():
            obj = form.save(commit=False)
            uploaded_by = Account.objects.filter(email=user.email).first()
            obj.uploaded_by = uploaded_by;
            obj.save()
            return redirect('book_list')
    else:
        form = BookForm()
    return render(request, 'book/upload_book.html', {
        'upload_form' : form
        })

  

model配置 

 

class Book(models.Model):
    title = models.CharField(max_length=100, null=False, blank=False)
    author = models.CharField(max_length=100, null=False, blank=False)
    pdf = models.FileField(upload_to='files', null=False, blank=False)
    date_uploaded = models.DateTimeField(auto_now_add=True, verbose_name = "date uploaded")
    uploaded_by = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete = models.CASCADE)
    # slug = models.SlugField(blank=True, unique=True)

 form 配置

 

from django import forms
from .models import Book
 
class BookForm(forms.ModelForm):
    class Meta:
        model = Book
        fields = ('title', 'author', 'pdf')

  

posted @   Oops!#  阅读(38)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端
历史上的今天:
2020-08-01 安装Elasticsearch-head插件
2020-08-01 elastic常用命令
2019-08-01 k8s Pod 扩容和缩容
2018-08-01 Redis 性能测试
点击右上角即可分享
微信分享提示