Как загрузить сохраненный файл в django
В моем случае пользователь вводит слово на фронт-энде, а на бэк-энде я вызываю некоторую функцию, которую я написал, и в конце я создаю файл .PDF в каталоге /media/reports
.
Как я могу сделать эти файлы удобными для пользователя и сохранить их в базе данных?
до этого я реализовал свой код без моделей и форм и просто сохранил файл в директории /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 redirect 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 пользователя-владельца.