博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Django中的文件上传(利用class-based view)
阅读量:6859 次
发布时间:2019-06-26

本文共 2739 字,大约阅读时间需要 9 分钟。

背景介绍

在Django的官网上有专门介绍如何处理文件上传的,其中说到了如何利用model来处理文件上传的场景。但是,在Django中最快速的开发方式是利用class-based views来进行开发。所以,我自己整理了一下如何利用class-based views来处理文件上传的场景,特此记录。


model

既然是数据驱动的web,自然先要有model。

from django.db import modelsfrom django.contrib.auth.models import Userfrom django.conf import settingsimport os_roles_path = os.path.join(_base_path, 'roles')def var_dir(instance, filename):    return os.path.join(_roles_path, instance.name, 'vars', filename)def task_dir(instance, filename):    return os.path.join(_roles_path, instance.name, 'tasks', filename)class Roles(models.Model):    id = models.AutoField(primary_key=True)    name = models.CharField(max_length=50)    creator = models.ForeignKey(User)    createDatetime = models.DateTimeField(auto_now_add=True)    directory = models.FilePathField(path=_roles_path, match='*.yml', recursive=True, max_length=200)    tasks = models.FileField(upload_to=task_dir, blank=False)    vars = models.FileField(upload_to=var_dir)    def __unicode__(self):        return u'%s' % self.name

上面用到了动态的upload_to,对应每个都提供不同的上传路径。因为upload_to可以接受一个callable的对象,所以我尝试过把lambda赋值给upload_to,但是在测试中发现,给upload_to赋值为lambda表达式是会报错的ValueError: Cannot serialize function: lambda。应该可以尝试利用闭包的方式来给upload_to赋值,以解决多种动态路径的需求。

经过后续的测试发现,闭包也是不支持的

def _roles_subdir(roles_path, subdir):    def wrapper(instance, filename):        return os.path.join(roles_path, instance.name, subdir, filename)    return wrapper

Please note that due to Python 2 limitations, you cannot serialize unbound method functions (e.g. a method declared

and used in the same class body). Please move the function into the main module body to use migrations.
For more information, see

view

本例中使用Django提供的CreateView。在实际的使用中,可以针对于自己的应用场景选择CreateView、UpdateView。

from django.views.generic.edit import FormView, CreateViewfrom django.views.decorators.csrf import csrf_exemptfrom django.core.urlresolvers import reverse_lazyclass UploadRolesFormView(CreateView):    template_name = 'app/upload_roles.html'    model = Roles    fields = ['name', 'tasks', 'vars']    success_url = reverse_lazy('app:index')    #临时去掉CSRF保护,千万别学我!    @csrf_exempt    def dispatch(self, request, *args, **kwargs):        return super(UploadRolesFormView, self).dispatch(request, *args, **kwargs)    #override    def form_valid(self, form):        #在form中加入user对象存入model        form.instance.creator = self.request.user        return super(UploadRolesFormView, self).form_valid(form)

template

            upload        

url

在app的urls.py中加入一条对应的url规则:

url(r'^upload/$', views.UploadRolesFormView.as_view(), name='rolesUpload'),

这样,就可以利用Django最方便的class-based views开处理文件上传的场景了。

转载地址:http://irnyl.baihongyu.com/

你可能感兴趣的文章
Spring小知识
查看>>
Oracle 12c连接时报错ORA-28040问题解决方法
查看>>
入门设计模式之状态模式
查看>>
Python机器学习(二):线性回归算法
查看>>
SQL Server中有关约束(constraint)的一些细节
查看>>
MapReduce高级特性
查看>>
CentOS6.9编译安装nginx1.4.7
查看>>
使用 CodeMirror 打造属于自己的在线代码编辑器
查看>>
表单元素01
查看>>
React Native项目Xcode打包发布iOS问题
查看>>
JPress v1.0-rc2 发布,新增微信小程序 SDK
查看>>
Confluence 6 为搜索引擎隐藏外部链接
查看>>
Python Mysql 数据库操作
查看>>
iOS Autolayout 介绍 2 Interface Builder 技巧
查看>>
打卡加虐狗
查看>>
Springboot + swagger2 通过实体对象封装形式上传视频或者图片问题解决
查看>>
Confluence 5 中如何快速创建一个 JIRA Ticket
查看>>
TP5搭建虚拟主机详细步骤
查看>>
高通骁龙 675 发布:首发第四代 Kryo CPU,2019 年 Q1 商用
查看>>
为什么我们做分布式使用Redis?
查看>>