为什么Django模板中的.url没有链接到模型的“upload_to =”目录?

问题描述 投票:0回答:1

我制作了一个模板来列出带有下载链接的文档,但不是链接到:

它链接到:

在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),
]

在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应用程序(以及有史以来第一个网络应用程序),我想我错过了非常基本的东西。你有好主意吗 ?

python django django-templates
1个回答
-1
投票

看起来:

{{ document.docfile.url }}

不存储文档的实际URL,而是将其名称添加到媒体目录URL。

因此,如果文件位于子目录中,则必须位于文件字段的name参数中:

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)

这可能不安全,因为用户可以在内部下载所有内容,只要他们可以猜出网址。另一种选择是创建一个继续下载的视图功能。

© www.soinside.com 2019 - 2024. All rights reserved.