首页 > 解决方案 > 如何在 django 中上传保存的文件

问题描述

在我的例子中,用户在前端给出一个词,在后端,我将调用我编写的一些函数,最后,我将在/media/reports目录中构建一个 .PDF 文件。如何使这些文件特定于用户并将它们保存在数据库中?

在此之前,我在没有模型和表单的情况下实现了我的代码,只是将文件保存在/media/reports/目录中。并且用户可以在被重定向到下载页面后立即下载该文件。

但是现在,我想将这些文件保存到每个用户将访问其配置文件中的新文件的数据库中。我怎样才能做到这一点 ?
这是我的代码:

views.py:

@login_required(login_url='/login/')
def dothat(request):
    if request.method == 'GET':
        return render(request, 'app/dothat.html')

    else:
        try:
            global word, user_name, function_name
            function_name = dothat.__name__
            word = request.POST.get("word")
            user_name = request.user
            full_name = request.user.get_full_name()
            myscript.script_one(word, user_name,full_name, function_name)
            

            # And in the called myscript, after doing some things,
            # the PDF file will be saved in /media/reports/ directory  



        except ValueError:
            return render(request, 'app/dashboard.html', {'error':'Bad data passed in. Try again.'})


    # And then, the user will be redirected to the download page to download that single file

    return render(request, 'app/download.html')

download_file里面的功能views.py

@login_required(login_url='/login/')
def download_file(request):
    filename = f"{function_name}-{word}.pdf"
    # Define the full file path
    filepath = f"{BASE_DIR}/app/media/app/reports/{user_name}/{filename}"
    # Open the file for reading content
    if os.path.exists(filepath):
        # Set the return value of the HttpResponse
        response = HttpResponse(open(filepath, 'rb'))
    # Set the HTTP header for sending to browser
        response['Content-Disposition'] = "attachment; filename=%s" % filename
        return response
    # Return the response value
    else:
        raise HTTP404

models.py是基于我的新需求的,我不确定它是否正确:

from django.db import models
from django.contrib.auth.models import User


    class Report(models.Model):
        word = models.CharField(max_length=100)
        title = models.CharField(max_length=100) # i want this title be the file name that i built in the dothat() function.

        report_file = models.FileField(upload_to='reports/%Y/%m/%d')
        report_date = models.DateTimeField(auto_now=True)
        owner = models.ForeignKey(User, on_delete = models.CASCADE)

forms.py

from django.forms import ModelForm
from .models import Report
from django import forms


class IpscanForm(ModelForm):
    class Meta:
        model = Report
        fields = ['word'] # user just enter the word

我想在表单和模型中实现用户单一输入,将后端处理的文件保存在数据库中,并收集所有用户特定的文件,以便在下载部分页面上向用户显示。我只是不知道如何将这些东西联系在一起。你有什么想法可以帮助我吗?

标签: python-3.xdjangodjango-modelsdjango-forms

解决方案


@login_required(login_url='/login/')
def user_reports(request):
   user_reports = models.Report.objects.filter(owner=request.user)
   return render(request, 'yourhtmlfile.html', {'user_reports':user_reports})

这将允许您显示发送请求的用户的所有报告。基本上,我们用请求用户过滤报表模型,并得到所有与所有者用户的 pk 匹配的报表。


推荐阅读