国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

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

oogh / 1436人閱讀

摘要:背景介紹在的官網(wǎng)上有專門介紹如何處理文件上傳的文檔,其中說(shuō)到了如何利用來(lái)處理文件上傳的場(chǎng)景。但是,在中最快速的開發(fā)方式是利用來(lái)進(jìn)行開發(fā)。上面用到了動(dòng)態(tài)的,對(duì)應(yīng)每個(gè)都提供不同的上傳路徑。在實(shí)際的使用中,可以針對(duì)于自己的應(yīng)用場(chǎng)景選擇。

背景介紹

在Django的官網(wǎng)上有專門介紹如何處理文件上傳的文檔,其中說(shuō)到了如何利用model來(lái)處理文件上傳的場(chǎng)景。但是,在Django中最快速的開發(fā)方式是利用class-based views來(lái)進(jìn)行開發(fā)。所以,我自己整理了一下如何利用class-based views來(lái)處理文件上傳的場(chǎng)景,特此記錄。


model

既然是數(shù)據(jù)驅(qū)動(dòng)的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

上面用到了動(dòng)態(tài)的upload_to,對(duì)應(yīng)每個(gè)FileField都提供不同的上傳路徑。因?yàn)閡pload_to可以接受一個(gè)callable的對(duì)象,所以我嘗試過(guò)把lambda賦值給upload_to,但是在測(cè)試中發(fā)現(xiàn),給upload_to賦值為lambda表達(dá)式是會(huì)報(bào)錯(cuò)的ValueError: Cannot serialize function: lambda。應(yīng)該可以嘗試?yán)瞄]包的方式來(lái)給upload_to賦值,以解決多種動(dòng)態(tài)路徑的需求。

經(jīng)過(guò)后續(xù)的測(cè)試發(fā)現(xiàn),閉包也是不支持的

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

view

本例中使用Django提供的CreateView。在實(shí)際的使用中,可以針對(duì)于自己的應(yīng)用場(chǎng)景選擇CreateView、UpdateView。

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")

    #臨時(shí)去掉CSRF保護(hù),千萬(wàn)別學(xué)我!
    @csrf_exempt
    def dispatch(self, request, *args, **kwargs):
        return super(UploadRolesFormView, self).dispatch(request, *args, **kwargs)

    #override
    def form_valid(self, form):
        #在form中加入user對(duì)象存入model
        form.instance.creator = self.request.user
        return super(UploadRolesFormView, self).form_valid(form)
template

    
        upload
        
        
    

    
        
url

在app的urls.py中加入一條對(duì)應(yīng)的url規(guī)則:

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

這樣,就可以利用Django最方便的class-based views開處理文件上傳的場(chǎng)景了。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/37644.html

相關(guān)文章

  • 利用Django通用類視圖(class-based view)編寫數(shù)據(jù)驅(qū)動(dòng)(ModeForm)WEB

    摘要:既然是數(shù)據(jù)驅(qū)動(dòng)的,首先就必須要有數(shù)據(jù)。也符合它用于查看數(shù)據(jù)的需求。說(shuō)明模板中的對(duì)象就是從中取出的數(shù)據(jù)。以的類型存儲(chǔ)著所有數(shù)據(jù)。修改視圖接下來(lái)就是第二類修改視圖了。其中的會(huì)將中的該字段設(shè)為類型而則是帶有清除文件功能的類型。 最近在學(xué)習(xí)Django,官方文檔介紹地十分詳細(xì)。但是大而全就難免會(huì)有些不夠速成,和我們這個(gè)浮躁的互聯(lián)網(wǎng)時(shí)代格格不入,所以我就整理了這個(gè)文檔。就像coolshell說(shuō)的...

    CarterLi 評(píng)論0 收藏0
  • django rest framework個(gè)人學(xué)習(xí)筆記(五)————Tutorial3.Class-

    摘要:官網(wǎng)地址個(gè)人學(xué)習(xí)筆記四我們也能夠使用來(lái)編寫我們的,而不是基于正如我們所看到的,這是一個(gè)強(qiáng)大的模式,它使我們的功能能夠復(fù)用,并保持我們的代碼整潔。檢索,更新或者刪除一個(gè)實(shí)例。接下來(lái)將展示使用來(lái)組成我們的。 (官網(wǎng)地址)[django rest framework個(gè)人學(xué)習(xí)筆記(四)————Tutorial] Class-based views 我們也能夠使用class-based view...

    Sanchi 評(píng)論0 收藏0
  • django rest framework個(gè)人學(xué)習(xí)筆記(五)————Tutorial3.Class-

    摘要:官網(wǎng)地址個(gè)人學(xué)習(xí)筆記四我們也能夠使用來(lái)編寫我們的,而不是基于正如我們所看到的,這是一個(gè)強(qiáng)大的模式,它使我們的功能能夠復(fù)用,并保持我們的代碼整潔。檢索,更新或者刪除一個(gè)實(shí)例。接下來(lái)將展示使用來(lái)組成我們的。 (官網(wǎng)地址)[django rest framework個(gè)人學(xué)習(xí)筆記(四)————Tutorial] Class-based views 我們也能夠使用class-based view...

    wenshi11019 評(píng)論0 收藏0
  • django rest framework個(gè)人學(xué)習(xí)筆記(五)————Tutorial3.Class-

    摘要:官網(wǎng)地址個(gè)人學(xué)習(xí)筆記四我們也能夠使用來(lái)編寫我們的,而不是基于正如我們所看到的,這是一個(gè)強(qiáng)大的模式,它使我們的功能能夠復(fù)用,并保持我們的代碼整潔。檢索,更新或者刪除一個(gè)實(shí)例。接下來(lái)將展示使用來(lái)組成我們的。 (官網(wǎng)地址)[django rest framework個(gè)人學(xué)習(xí)筆記(四)————Tutorial] Class-based views 我們也能夠使用class-based view...

    channg 評(píng)論0 收藏0
  • Django1.7開發(fā)官網(wǎng)(二)

    摘要:為了避免做廣告的嫌疑,以后會(huì)把熙魷記個(gè)字去掉了。在和用戶注冊(cè)的賬戶功能,比如登陸注冊(cè)退出修改密碼等都在里實(shí)現(xiàn)。第二個(gè)參數(shù)要跳轉(zhuǎn)的路徑,如果沒(méi)有第二個(gè)參數(shù)則默認(rèn)跳轉(zhuǎn)到登陸頁(yè)面里添加 為了避免做廣告的嫌疑,以后會(huì)把熙魷記3個(gè)字去掉了。 現(xiàn)在我們完善登陸和注冊(cè)功能。 首先,我們要為站點(diǎn)創(chuàng)建一個(gè)超級(jí)用戶python manage.py createsuperuser然后根據(jù)命令行提示輸入用...

    call_me_R 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<