Почему шаблон .url в Django не ссылается на каталог «upload_to =» модели? - PullRequest
0 голосов
/ 25 февраля 2019

Я создал шаблон для перечисления документов со ссылкой для скачивания, но вместо ссылки на:

он ссылается на:

В myapp / models.py

class Document(models.Model):
    docfile = models.FileField(upload_to='documents')

В myapp / templates / myapp/list.html

    <ul>
    {% for document in documents %}
        <li><a href="{{ document.docfile.url }}">{{ document.docfile.name }}</a></li>
    {% endfor %}
    </ul>

document.docfile.url ссылается на media / mydoc.csv, но файл сохраняется в media / documents / mydoc.csv

Версии

  • Python: 3.7.2
  • Django: 2.1.7
  • ОС: Windows 10

В myapp / views.py

def myview(request):

    documents = Document.objects.all()
    return render(request, 'myapp/list.html', {'documents': documents})

В myapp / urls.py

app_name = 'myapp'
urlpatterns = [
    path('', views.index, name='index'),
    path('myview/', views.myview, name='myview'),
]

В myproject / urls.py

urlpatterns = [
    path('', views.index, name='index'),
    path('myapp/', include('myapp.urls')),
    path('admin/', admin.site.urls),
]

In settings.py

BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))

MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
MEDIA_URL = '/media/'

Поскольку это мое первое приложение Django (и первое в истории веб-приложение), я думаю, что упустил что-то очень простое,У вас есть идея?

1 Ответ

0 голосов
/ 25 февраля 2019

Похоже, что:

{{ document.docfile.url }}

Не хранит фактический URL-адрес документа, но добавляет его имя в URL-адрес каталога мультимедиа.

Так что, если файл находится вПодкаталог, он должен быть в параметре name поля file:

document_name = 'document_name.csv'
upload_subdir = 'documents'
document.docfile.name = os.path.join(upload_subdir, document_name)

Другой момент заключается в том, что корень носителя должен быть объявлен как статический каталог в mysite / urls.py, чтобы разрешить загрузки:

urlpatterns = [
    path('', views.index, name='index'),
    path('myapp/', include('myapp.urls')),
    path('admin/', admin.site.urls),
]+ static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

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

...