我在不使用FileField()的情况下创建了一个模型,并将url保存到路径字段中。现在显示我可以看到属性,但我无法下载文件。 href将其视为一个页面,我收到一条错误,说GET请求失败。
我也需要为静态文件做同样的事情。
models.py看起来像这样:
import os
from django.conf import settings
from django.db import models
# Create your models here.
class Document(models.Model):
code = models.CharField(max_length = 50)
path = models.CharField(max_length = 500)
date_of_submission = models.CharField(max_length = 50)
type = models.CharField(max_length = 50)
title = models.CharField(max_length = 200)
department = models.CharField(max_length = 50)
subject = models.CharField(max_length = 100)
updation_allowed = models.CharField(max_length = 1, default = '0')
@property
def relative_path(self):
return os.path.relpath(self.path, settings.MEDIA_ROOT)
模板有一些像这样的代码:
<a href = '{{ MEDIA_URL }}{{ value.thesis.relative_path }}'> Thesis </a>
*static files*
<a href='/uploads/report.pdf'> Front Page</a>
我尝试使用该属性并自己提供路径。
urls.py(project / urls.py)
from django.conf.urls.static import static
urlpatterns = [
...
]
urlpatterns += static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
settings.朋友
...
STATIC_ROOT = os.path.join(BASE_DIR, 'static')
STATIC_URL = '/static/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
MEDIA_URL = '/media/'
要允许文件下载,您需要创建一个单独的视图,并将FileResponse作为响应。这个视图将使用html模板中提供的url来获取一些独特的参数(我认为它将是文件的相对路径)。在此视图中,FileResponse将按提供的路径打开您的文件,然后将返回您的文件的响应。我想你应该这样做:
views.朋友:
def download_file(request, relative_path): # this is a view with file response
media_root = settings.MEDIA_ROOT
return FileResponse(open(f"{media_root}\{relative_path}", "rb"), as_attachment=True, filename="some_name.smth")
模板:
<a href = '{% url "download" relative_path=value.thesis.relative_path %}'> Thesis </a>
*static files*
<a href='/uploads/report.pdf'> Front Page</a>
URLs.朋友:
urlpatterns = [
path("download-file/<slug:relative_path>/", views.download_file, name="download")]
您需要与PATCHes结合使其工作。