Как загрузить сохраненный файл в 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 пользователя-владельца.

Вернуться на верх