python-3.x - 如何在 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
我想在表单和模型中实现用户单一输入,将后端处理的文件保存在数据库中,并收集所有用户特定的文件,以便在下载部分页面上向用户显示。我只是不知道如何将这些东西联系在一起。你有什么想法可以帮助我吗?
解决方案
@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 匹配的报表。
推荐阅读
- android - BillingClient.BillingResponseCode.ITEM_ALREADY_OWNED:并重新验证购买
- python - 如何使用 python 中的 aws-cdk 设置 Amazon S3 通知以在您的存储桶中发生某些事件时接收通知?
- node.js - 如何使用特定的 Node 解释器运行 NPM?
- javascript - 如何在不刷新页面的情况下将值从 jsp 页面发送到数据库
- url - URL 重写出站规则失败
- perl - Net::SSLeay 使用 openssl 未能通过 Applink 测试
- xcode - Xcode 显示不正确的 git 状态
- python - 从导入创建 conda 环境
- java - 使用现有兄弟属性值对属性进行杰克逊多态反序列化
- python-3.x - PySpark:如何聚合具有可变宽度的列数组?