资讯专栏INFORMATION COLUMN

Django中的文件上传(利用class-based view)

oogh / 1511人阅读

摘要:背景介绍在的官网上有专门介绍如何处理文件上传的文档,其中说到了如何利用来处理文件上传的场景。但是,在中最快速的开发方式是利用来进行开发。上面用到了动态的,对应每个都提供不同的上传路径。在实际的使用中,可以针对于自己的应用场景选择。

背景介绍

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


model

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

</>复制代码

  1. from django.db import models
  2. from django.contrib.auth.models import User
  3. from django.conf import settings
  4. import os
  5. _roles_path = os.path.join(_base_path, "roles")
  6. def var_dir(instance, filename):
  7. return os.path.join(_roles_path, instance.name, "vars", filename)
  8. def task_dir(instance, filename):
  9. return os.path.join(_roles_path, instance.name, "tasks", filename)
  10. class Roles(models.Model):
  11. id = models.AutoField(primary_key=True)
  12. name = models.CharField(max_length=50)
  13. creator = models.ForeignKey(User)
  14. createDatetime = models.DateTimeField(auto_now_add=True)
  15. directory = models.FilePathField(path=_roles_path, match="*.yml", recursive=True, max_length=200)
  16. tasks = models.FileField(upload_to=task_dir, blank=False)
  17. vars = models.FileField(upload_to=var_dir)
  18. def __unicode__(self):
  19. return u"%s" % self.name

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

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

</>复制代码

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

</>复制代码

  1. 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
    https://docs.djangoproject.com/en/1.7/topics/migrations/#serializing-values

view

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

</>复制代码

  1. from django.views.generic.edit import FormView, CreateView
  2. from django.views.decorators.csrf import csrf_exempt
  3. from django.core.urlresolvers import reverse_lazy
  4. class UploadRolesFormView(CreateView):
  5. template_name = "app/upload_roles.html"
  6. model = Roles
  7. fields = ["name", "tasks", "vars"]
  8. success_url = reverse_lazy("app:index")
  9. #临时去掉CSRF保护,千万别学我!
  10. @csrf_exempt
  11. def dispatch(self, request, *args, **kwargs):
  12. return super(UploadRolesFormView, self).dispatch(request, *args, **kwargs)
  13. #override
  14. def form_valid(self, form):
  15. #在form中加入user对象存入model
  16. form.instance.creator = self.request.user
  17. return super(UploadRolesFormView, self).form_valid(form)
template

</>复制代码

  1. upload
url

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

</>复制代码

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

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

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/37644.html

相关文章

  • 利用Django通用类视图(class-based view)编写数据驱动(ModeForm)WEB

    摘要:既然是数据驱动的,首先就必须要有数据。也符合它用于查看数据的需求。说明模板中的对象就是从中取出的数据。以的类型存储着所有数据。修改视图接下来就是第二类修改视图了。其中的会将中的该字段设为类型而则是带有清除文件功能的类型。 最近在学习Django,官方文档介绍地十分详细。但是大而全就难免会有些不够速成,和我们这个浮躁的互联网时代格格不入,所以我就整理了这个文档。就像coolshell说的...

    CarterLi 评论0 收藏0
  • django rest framework个人学习笔记(五)————Tutorial3.Class-

    摘要:官网地址个人学习笔记四我们也能够使用来编写我们的,而不是基于正如我们所看到的,这是一个强大的模式,它使我们的功能能够复用,并保持我们的代码整洁。检索,更新或者删除一个实例。接下来将展示使用来组成我们的。 (官网地址)[django rest framework个人学习笔记(四)————Tutorial] Class-based views 我们也能够使用class-based view...

    Sanchi 评论0 收藏0
  • django rest framework个人学习笔记(五)————Tutorial3.Class-

    摘要:官网地址个人学习笔记四我们也能够使用来编写我们的,而不是基于正如我们所看到的,这是一个强大的模式,它使我们的功能能够复用,并保持我们的代码整洁。检索,更新或者删除一个实例。接下来将展示使用来组成我们的。 (官网地址)[django rest framework个人学习笔记(四)————Tutorial] Class-based views 我们也能够使用class-based view...

    wenshi11019 评论0 收藏0
  • django rest framework个人学习笔记(五)————Tutorial3.Class-

    摘要:官网地址个人学习笔记四我们也能够使用来编写我们的,而不是基于正如我们所看到的,这是一个强大的模式,它使我们的功能能够复用,并保持我们的代码整洁。检索,更新或者删除一个实例。接下来将展示使用来组成我们的。 (官网地址)[django rest framework个人学习笔记(四)————Tutorial] Class-based views 我们也能够使用class-based view...

    channg 评论0 收藏0
  • Django1.7开发官网(二)

    摘要:为了避免做广告的嫌疑,以后会把熙鱿记个字去掉了。在和用户注册的账户功能,比如登陆注册退出修改密码等都在里实现。第二个参数要跳转的路径,如果没有第二个参数则默认跳转到登陆页面里添加 为了避免做广告的嫌疑,以后会把熙鱿记3个字去掉了。 现在我们完善登陆和注册功能。 首先,我们要为站点创建一个超级用户python manage.py createsuperuser然后根据命令行提示输入用...

    call_me_R 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<