Загрузка файла, хранящегося в модели, с помощью поля FileField с помощью Django

Я планирую создать простое приложение для загрузки файлов на Django (включенное в какой-то более крупный проект). Для этого я использую две ссылки: /files/ - для вывода списка всех загруженных файлов от определенного пользователя, и /files/upload/ - для отображения формы загрузки для пользователя, чтобы добавить новый файл на сервер.

Я использую базу данных PostgreSQL, и я планирую хранить все мои файлы в модели File, которая выглядит следующим образом:

class File(models.Model):
    content = models.FileField()
    uploader = models.ForeignKey(User, on_delete=models.CASCADE)

Мой вид загрузки файлов выглядит следующим образом:

@login_required
def file_upload_view(request):
    if request.method == "POST" and request.FILES['file']:
        file = request.FILES['file']
        File.objects.create(content=file, uploader=request.user)
        return render(request, "file_upload_view.html")
    else:
        return render(request, "file_upload_view.html")

пока мой вид списка файлов выглядит следующим образом:

@login_required
def file_view(request):
    files = File.objects.filter(uploader = request.user)
    return render(request, "file_view.html", {'files': files})

Проблема в том, что я хочу, чтобы мой file_view() отображал все файлы, загруженные определенным пользователем в шаблоне (что я уже сделал), каждый файл имел гиперссылку на место загрузки. Я пытался сделать это в моем шаблоне списка файлов:

{% extends 'base.html' %}
{% block content %}
<h2>Files of {{ request.user }}</h2>
<br>
{% for file in files %}
    <a href="{{ file.content }}" download>{{ file.content }}</a>
{% endfor %}
{% endblock %}

но мой браузер пытается загрузить какую-то .htm страницу, даже если загруженный файл имеет тип .txt.

Мой вопрос: нужно ли мне также загрузить файл в определенный каталог, прежде чем добавить его в модель? Нужно ли мне на самом деле добавить URL файла в качестве нового поля в моей модели? Разве файлы не загружаются автоматически в мою базу данных PostgreSQL?

Любая помощь будет очень признательна. Спасибо.

Наверное, нужно показать папку, в которую вы хотите сохранить файлы, вот так: content = models.FileField(upload_to='/myfiles/'). И тогда вы сможете показать url ("{% url 'file.url' %}") в html, потому что база данных на самом деле сохраняет url вашего файла и хранит сам файл в папке, которую вы показали в модели.

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