Загрузка файла, хранящегося в модели, с помощью поля 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 вашего файла и хранит сам файл в папке, которую вы показали в модели.