我是使用Django的新手,我正在尝试开发一个用户可以上传大量excel文件的网站,然后将这些文件存储在媒体文件夹中 Webproject / project /媒体。
def upload(request):
if request.POST:
form = FileForm(request.POST, request.FILES)
if form.is_valid():
form.save()
return render_to_response('project/upload_successful.html')
else:
form = FileForm()
args = {}
args.update(csrf(request))
args['form'] = form
return render_to_response('project/create.html', args)
然后,文档将与列表中的任何其他文档一起显示在列表中,您可以单击该文档,它将显示有关它们的基本信息以及它们上载的文件的名称。从这里,我希望能够使用以下链接再次下载相同的Excel文件:
<a href="/project/download"> Download Document </a>
我的网址是
urlpatterns = [
url(r'^$', ListView.as_view(queryset=Post.objects.all().order_by("-date")[:25],
template_name="project/project.html")),
url(r'^(?P<pk>\d+)$', DetailView.as_view(model=Post, template_name="project/post.html")),
url(r'^upload/$', upload),
url(r'^download/(?P<path>.*)$', serve, {'document root': settings.MEDIA_ROOT}),
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
但是我收到了错误,serve()得到了一个意外的关键字参数&#39; document root&#39;。任何人都可以解释如何解决这个问题吗?
或
说明如何使用
选择和提供上传的文件def download(request):
file_name = #get the filename of desired excel file
path_to_file = #get the path of desired excel file
response = HttpResponse(mimetype='application/force-download')
response['Content-Disposition'] = 'attachment; filename=%s' % smart_str(file_name)
response['X-Sendfile'] = smart_str(path_to_file)
return response
答案 0 :(得分:48)
您在参数文档 _ root中错过了下划线。但是在生产中使用serve
是个坏主意。请改用这样的东西:
import os
from django.conf import settings
from django.http import HttpResponse, Http404
def download(request, path):
file_path = os.path.join(settings.MEDIA_ROOT, path)
if os.path.exists(file_path):
with open(file_path, 'rb') as fh:
response = HttpResponse(fh.read(), content_type="application/vnd.ms-excel")
response['Content-Disposition'] = 'inline; filename=' + os.path.basename(file_path)
return response
raise Http404
答案 1 :(得分:11)
在view.py中实现类似的功能
def download(request, id):
obj = your_model_name.objects.get(id=id)
filename = obj.model_attribute_name.path
response = FileResponse(open(filename, 'rb'))
return response
答案 2 :(得分:4)
您可以在代码内添加“下载”属性以下载文件。
<a href="/project/download" download> Download Document </a>
答案 3 :(得分:3)
我发现Django的FileField
对于让用户上传和下载文件确实很有帮助。 Django文档的managing files部分。您可以将有关文件的某些信息以及指向文件本身的FileField
存储在表中。然后,您可以通过搜索表格列出可用文件。
答案 4 :(得分:3)
使用FileField
上传文件时,该文件将具有一个URL,可用于指向该文件并使用HTML download
属性下载该文件,您只需执行此操作即可。 / p>
models.py
model.py看起来像这样
class CsvFile(models.Model):
csv_file = models.FileField(upload_to='documents')
views.py
#csv上传
class CsvUploadView(generic.CreateView):
model = CsvFile
fields = ['csv_file']
template_name = 'upload.html'
#csv下载
class CsvDownloadView(generic.ListView):
model = CsvFile
fields = ['csv_file']
template_name = 'download.html'
然后在您的模板中。
#上传模板
upload.html
<div class="container">
<form action="#" method="POST" enctype="multipart/form-data">
{% csrf_token %}
{{ form.media }}
{{ form.as_p }}
<button class="btn btn-primary btn-sm" type="submit">Upload</button>
</form>
#download模板
download.html
{% for document in object_list %}
<a href="{{ document.csv_file.url }}" download class="btn btn-dark float-right">Download</a>
{% endfor %}
我没有使用表单,只是使用了呈现的模型,而是使用了 FileField 这两种方法,并且都可以使用。
答案 5 :(得分:1)
@Biswadp 的解决方案对我很有用
在您的静态文件夹中,确保有您希望用户下载的所需文件
在您的 HTML 模板中,您的代码应如下所示:
<a href="{% static 'Highlight.docx' %}"> Download </a>
答案 6 :(得分:0)
像这样简单地使用html下载使用静态关键字提到的文件
<a href="{% static 'bt.docx' %}" class="btn btn-secondary px-4 py-2 btn-sm">Download CV</a>
答案 7 :(得分:0)
我使用这种方法:
{% if quote.myfile %}
<div class="">
<a role="button"
href="{{ quote.myfile.url }}"
download="{{ quote.myfile.url }}"
class="btn btn-light text-dark ml-0">
Download attachment
</a>
</div>
{% endif %}
答案 8 :(得分:0)
如果您将文件上传到媒体中,则:
media
示例输入文件.txt
views.py
def download_csv(request):
file_path = os.path.join(settings.MEDIA_ROOT, 'example-input-file.txt')
if os.path.exists(file_path):
with open(file_path, 'rb') as fh:
response = HttpResponse(fh.read(), content_type="application/vnd.ms-excel")
response['Content-Disposition'] = 'inline; filename=' + os.path.basename(file_path)
return response
urls.py
path('download_csv/', views.download_csv, name='download_csv'),
download.html
a href="{% url 'download_csv' %}" download=""
答案 9 :(得分:0)
1.settings.py:
MEDIA_DIR = os.path.join(BASE_DIR,'media')
#Media
MEDIA_ROOT = MEDIA_DIR
MEDIA_URL = '/media/'
2.urls.py:
from django.conf.urls.static import static
urlpatterns += static(settings.MEDIA_URL,document_root=settings.MEDIA_ROOT)
3.in 模板:
<a href="{{ file.url }}" download>Download File.</a>
有关更多详细信息,请使用此链接: https://youtu.be/MpDZ34mEJ5Y