python - 为什么 Django 模板中的 .url 没有链接到模型的“upload_to=”目录?
问题描述
我制作了一个模板来列出带有下载链接的文档,但没有链接到:
它链接到:
在 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
版本
- 蟒蛇:3.7.2
- 姜戈: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),
]
在 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 应用程序(也是第一个 web 应用程序),我想我错过了一些非常基本的东西。你有想法吗 ?
解决方案
看起来:
{{ 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。另一种选择是创建一个继续下载的视图函数。
推荐阅读
- vb.net - 更新 DataGridViewTable
- javascript - JS/jQuery 本地存储数组
- python - Keras 回归 | 从具有多个 y 参数的模型中获取单个预测
- c++ - 如何在c ++中绕一个圆圈
- c# - 当用户未添加图像时,如何避免在 datagridview 中查看 img 时出错
- python - 如何以向量化方式numpy多次索引多维数组?
- autodesk-viewer - 应用加载选项后缺少一些对象
- javascript - 如何在我的屏幕上显示秒表读数的值
- javascript - JavaScript 中的随机图像
- azure - API 的 JWT 令牌和 OAUTH 策略的 azure 保管库密钥