赞
踩
之前我们在前端页面的操作处,只是直接显示了下载两个字,现在我们要想实现点击“下载”文本链接时将相应的文件下载到电脑中。我们先修改index.html文件:
下载
通过get方式向后台download路由传递数据。
然后我们修改urls.py,注意这里由于要使用正则表达式,所以用的re_path:
re_path('download/(?P.*)',views.Download,name='download'),
注:fileurl不知为什么没起使用
接着编写了views.py中的代码:
def Download(request,fileurl): url = os.path.join("." + MEDIA_URL,request.GET['fileurl']) file_name = re.findall(".*/(.*?$)",url)[0] response = StreamingHttpResponse(file_iterator(url)) # 以流的形式下载文件,这样可以实现任意格式的文件下载 response['Content-Type'] = 'application/octet-stream' # Content-Disposition就是当用户想把请求所得的内容存为一个文件的时候提供一个默认的文件名 response['Content-Disposition'] = 'attachment;filename="{}"'.format(file_name) return response
这个函数的作用是取得url,注意url完整地址是:./upload/年/月/日/文件名,在这里我搞了很久很久。
网上还提供了一个文件生成器:
def file_iterator(file_path, chunk_size=512): """ 文件生成器,防止文件过大,导致内存溢出 :param file_path: 文件绝对路径 :param chunk_size: 块大小 :return: 生成器 """ with open(file_path, mode='rb') as f: while True: c = f.read(chunk_size) if c: yield c else: break
最后重启服务,点击下载,但毫不意外的又出现了意外,但凡文件名中有中文的,下载时仅显示一个download:
上网搜索了一下:
导入一个方法:
from django.utils.encoding import escape_uri_path
然后在将该方法应用到file_name上:
response['Content-Disposition'] = 'attachment;filename="{}"'.format(escape_uri_path(file_name))
再次点击下载,终于成功了!
目前为止,只有一个administrator帐号,为了交付给同事使用,需要创建几个帐号。
首先我们通过127.0.0.1:8000/admin登录后台管理,在站点管理这里增加帐号:
增加了一个帐户后,我们通过右上角的“注销”来退出administrator,然后使用新的帐号进行登录。
昨天创建帐号后,密码是明文,我还特意去网上找了解决方法,本来今天要写到这个文档中,结果今天发现又正常了,不过我决定还是将其写到这一步骤当中,只能说Django中真的是太多坑了!
先在models.py中创建一个UserProfile的表,该表继承自AbstractUser,添加如下代码:
from django.contrib.auth.models import AbstractUserfrom django.db import modelsclass UserProfile(AbstractUser): phone = models.CharField(max_length=11,verbose_name='手机号',null=True,blank=True)
然后在admini.py中添加如下代码:
from django.contrib import adminfrom django.contrib.auth.admin import UserAdminfrom django.utils.translation import gettext_lazyfrom .models import UserProfile@admin.register(UserProfile)class UserProfileAdmin(UserAdmin): list_display = ['username','password'] list_per_page = 10 add_fieldsets = ( (None, {u'fields': ('username', 'password1', 'password2')}), (gettext_lazy('User Information'), {'fields': ( 'phone',)}), )
这样添加后,在admin后台创建用户后就能解决了。
由于会有多个人参与附件管理,所以在修改用户信息时,给创建了一个组,并为组选择了如下几个权限:
这样的话以后新增加上传用户时只需要选择这个组就可以了,更加方便管理。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。