Python 为什么不';t Django模板中的.url链接到;上传至=";模型的目录?

Python 为什么不';t Django模板中的.url链接到;上传至=";模型的目录?,python,django,django-templates,Python,Django,Django Templates,我制作了一个模板来列出带有下载链接的文档,但没有链接到: 它链接到: 在myapp/models.py中 class Document(models.Model): docfile = models.FileField(upload_to='documents') def myview(request): documents = Document.objects.all() return render(request, 'myapp/list.html',

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

它链接到:

在myapp/models.py中

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

    documents = Document.objects.all()
    return render(request, 'myapp/list.html', {'documents': documents})
app_name = 'myapp'
urlpatterns = [
    path('', views.index, name='index'),
    path('myview/', views.myview, name='myview'),
]
urlpatterns = [
    path('', views.index, name='index'),
    path('myapp/', include('myapp.urls')),
    path('admin/', admin.site.urls),
]
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))

MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
MEDIA_URL = '/media/'
在myapp/templates/myapp/list.html中

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

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

    documents = Document.objects.all()
    return render(request, 'myapp/list.html', {'documents': documents})
app_name = 'myapp'
urlpatterns = [
    path('', views.index, name='index'),
    path('myview/', views.myview, name='myview'),
]
urlpatterns = [
    path('', views.index, name='index'),
    path('myapp/', include('myapp.urls')),
    path('admin/', admin.site.urls),
]
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))

MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
MEDIA_URL = '/media/'
在myproject/url.py中

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

    documents = Document.objects.all()
    return render(request, 'myapp/list.html', {'documents': documents})
app_name = 'myapp'
urlpatterns = [
    path('', views.index, name='index'),
    path('myview/', views.myview, name='myview'),
]
urlpatterns = [
    path('', views.index, name='index'),
    path('myapp/', include('myapp.urls')),
    path('admin/', admin.site.urls),
]
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))

MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
MEDIA_URL = '/media/'
在settings.py中

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

    documents = Document.objects.all()
    return render(request, 'myapp/list.html', {'documents': documents})
app_name = 'myapp'
urlpatterns = [
    path('', views.index, name='index'),
    path('myview/', views.myview, name='myview'),
]
urlpatterns = [
    path('', views.index, name='index'),
    path('myapp/', include('myapp.urls')),
    path('admin/', admin.site.urls),
]
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))

MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
MEDIA_URL = '/media/'
因为这是我第一个Django应用程序(也是有史以来第一个网络应用程序),我想我错过了一些非常基本的东西。你有什么想法吗?

看来:

{{ document.docfile.url }}
未存储文档的实际url,但将其名称添加到媒体目录url

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

document_name = 'document_name.csv'
upload_subdir = 'documents'
document.docfile.name = os.path.join(upload_subdir, document_name)
另一点是,媒体根目录必须声明为mysite/url.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。另一个选项是创建一个查看函数,继续下载。

docfile=models.FileField(upload_to='documents/')我认为您在文档之后缺少“/”,根据文档,我希望看到您的评论,但不幸的是,这并没有纠正错误。。。似乎object.field.url不知道正确的路径…MEDIA\u ROOT=os.path.join(BASE\u DIR,“MEDIA/”)MEDIA\u ROOT=os.path.join(BASE\u DIR,“MEDIA/”)不会更改结果。我通过使用document.docfile.name=os.path.join('documents',document\u name')生成文档来获得正确的路径。虽然路径现在是正确的,但仍然存在404错误。请求URL:
FileField.URL
调用存储来根据文件路径计算URL,它确实按预期工作,因此您无需做任何事情来获得正确的URL路径,并且您也不必添加静态文件URL以使文件的URL正确(无论如何,媒体都应该由前端服务器在生产环境中提供服务)。瞧,您真正的问题在别处,而您只是设法将其隐藏起来(在部署到生产环境时,有些东西充其量是多余的,可能会断开).NB:我假设你使用的是默认的文件系统存储。我当时有点困惑,因为文档的名称中也包含了子目录:之后,它只是一个内部应用程序,提供一个脚本生成的文件,将由3个人使用。但我仍然很想知道出了什么问题。这是我的第一个Web应用程序(几周前我学会了编程)我计划稍后将Django用于一个个人项目,这将是一个真正的网站。“我当时有点困惑,因为文档的名称中也包含子目录”=>是的,它确实应该这样做。文件的绝对路径和资源url都是根据相对路径(存储在db中)和(分别)计算的设置MEDIA_ROOT和MEDIA_URL。我不清楚您为什么会出现问题以及问题的来源,可能是您在没有直接访问计算机的情况下很难调试的那种问题……只有一点,但我认为您已经理解了这一点,所以我提到它只是为了以防万一:如果您更改(或添加)
upload\u to
在您已经创建了几条记录之后,已经上载的文件不会受到更改的影响(您必须为此编写数据迁移),只有新创建的文件才会受到影响。