我制作了一个模板来列出带有下载链接的文档,但是没有链接到:
它链接到:
在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
版本
在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),
]
在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应用程序(也是有史以来的第一个webapp),我想我错过了一些非常基本的东西。你有个主意吗?
答案 0 :(得分:-1)
似乎:
{{ document.docfile.url }}
不存储文档的实际URL,而是将其名称添加到媒体目录URL。
因此,如果文件位于子目录中,则它必须位于文件字段的名称参数中:
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,就可以下载内部的evrything。另一种选择是创建一个视图功能,以继续下载。