发布于 2015-12-05 06:24:29 | 229 次阅读 | 评论: 0 | 来源: PHPERZ

这里有新鲜出炉的Django 入门教程,程序狗速度看过来!

Django Python WEB开发框架

Django是一个开放源代码的Web应用框架,由Python写成。采用了MVC的软件设计模式,即模型M,视图V和控制器C。它最初是被开发来用于管理劳伦斯出版集团旗下的一些以新闻内容为主的网站的,即是CMS(内容管理系统)软件。并于2005年7月在BSD许可证下发布。这套框架是以比利时的吉普赛爵士吉他手Django Reinhardt来命名的。


背景介绍

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


model

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

from django.db import models
from django.contrib.auth.models import User
from django.conf import settings
import 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,对应每个FileField都提供不同的上传路径。因为upload_to可以接受一个callable的对象,所以我尝试过把lambda赋值给upload_to,但是在测试中发现,给upload_to赋值为lambda表达式是会报错的ValueError: Cannot serialize function: lambda。应该可以尝试利用闭包的方式来给upload_to赋值,以解决多种动态路径的需求。

view

from django.views.generic.edit import FormView, CreateView
from django.views.decorators.csrf import csrf_exempt
from django.core.urlresolvers import reverse_lazy

class 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

<html>
    <head>
        <title>upload</title>
        <meta http-equiv="description" content="this is my page">
        <meta http-equiv="content-type" content="text/html; charset=GB18030">
    </head>

    <body>
        <form action="{% url 'app:rolesUpload' %}" method="post" enctype="multipart/form-data">
            <input type="text" name="name" />
            <input type="file" name="tasks" />
            <input type="file" name="vars" />
            <input type="submit" value="上传" />
        </form>
    </body>
</html>

url

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

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

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



最新网友评论  共有(0)条评论 发布评论 返回顶部

Copyright © 2007-2017 PHPERZ.COM All Rights Reserved   冀ICP备14009818号  版权声明  广告服务