摘要:背景介紹在的官網(wǎng)上有專門介紹如何處理文件上傳的文檔,其中說到了如何利用來處理文件上傳的場景。但是,在中最快速的開發(fā)方式是利用來進行開發(fā)。上面用到了動態(tài)的,對應(yīng)每個都提供不同的上傳路徑。在實際的使用中,可以針對于自己的應(yīng)用場景選擇。
背景介紹
在Django的官網(wǎng)上有專門介紹如何處理文件上傳的文檔,其中說到了如何利用model來處理文件上傳的場景。但是,在Django中最快速的開發(fā)方式是利用class-based views來進行開發(fā)。所以,我自己整理了一下如何利用class-based views來處理文件上傳的場景,特此記錄。
既然是數(shù)據(jù)驅(qū)動的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
上面用到了動態(tài)的upload_to,對應(yīng)每個FileField都提供不同的上傳路徑。因為upload_to可以接受一個callable的對象,所以我嘗試過把lambda賦值給upload_to,但是在測試中發(fā)現(xiàn),給upload_to賦值為lambda表達式是會報錯的ValueError: Cannot serialize function: lambda。應(yīng)該可以嘗試利用閉包的方式來給upload_to賦值,以解決多種動態(tài)路徑的需求。
經(jīng)過后續(xù)的測試發(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
viewPlease 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
本例中使用Django提供的CreateView。在實際的使用中,可以針對于自己的應(yī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") #臨時去掉CSRF保護,千萬別學(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對象存入model form.instance.creator = self.request.user return super(UploadRolesFormView, self).form_valid(form)template
urlupload
在app的urls.py中加入一條對懄17(yīng)的url覄17(guī)則:
url(r"^upload/$", views.UploadRolesFormView.as_view(), name="rolesUpload"),
這樣,就可以利用Django朢方便的17class-based views開處理文件上傳的場景亄17〄17
文章版權(quán)歸作者所朄17,未綄17(jīng)允許請勿轄17(zhuǎn)輄17,若此文章存在違規(guī)行為,您可以聄17(lián)系管理員刪除〄17
轄17(zhuǎn)載請注明本文地址:http://systransis.cn/yun/37644.html
摘要:既然是敄17(shù)擄17(jù)驄17(qū)動的,首先就必須要有敄17(shù)擄17(jù)。也符合它用于查看數(shù)擄17(jù)的需汄17。說明模板中的對象就是從中取出的敄17(shù)擄17(jù)。以的類型存儲著扢有數(shù)擄17(jù)。修改視圖接下來就是第二類修改視圖了。其中的會將中的該字段設(shè)為類型則是帶有清除文件功能的類型〄17 朢近在孄17(xué)翄17(xí)Django,官方文檔介紹地十分詳細。但是大而全就難免會有些不夠速成,和我浮躁的互聯(lián)綄17(wǎng)時代格格不入,所以我就整理了這文檄17。就像coolshell說的...
摘要:官綄17(wǎng)地址個人孄17(xué)翄17(xí)筆記四我們也能夠使用來編寫我們的,不是基于正如我們所看到的17,是丢個強大的模式,它使我們的功能能夠径17(fù)甄17,并保持我的代碼整潔。檢約17,更新或者刪除一個實例接下來將展示使用來組成我的〄17 (官網(wǎng)地址)[django rest framework個人孄17(xué)翄17(xí)筆記(四)Tutorial] Class-based views 我也能夠使用class-based view...
摘要:官綄17(wǎng)地址個人孄17(xué)翄17(xí)筆記四我們也能夠使用來編寫我們的,不是基于正如我們所看到的,這是丢個強大的模式,它使我們的功能能夠径17(fù)用,并保持我們的代碼整潔。檢索,更新或刪除一個實侄17。接下來將展示使用來組成我的〄17 (官網(wǎng)地址)[django rest framework個人孄17(xué)翄17(xí)筆記(四)Tutorial] Class-based views 我也能夠使用class-based view...
摘要:官綄17(wǎng)地址個人孄17(xué)翄17(xí)筆記四我們也能夠使用來編寫我們的,不是基于正如我們所看到的17,是丢個強大的模式,它使我們的功能能夠径17(fù)甄17,并保持我的代碼整潔。檢索,更新或刪除一個實侄17。接下來將展示使用來組成我的〄17 (官網(wǎng)地址)[django rest framework個人孄17(xué)翄17(xí)筆記(四)Tutorial] Class-based views 我也能夠使用class-based view...
摘要:為了避免做廣告的嫌疄17,以后會把熙魷記個字去掉亄17。在和用戶注冊的賬戶功能,比如登陸注冊出修改密碼等都在里實珄17(xiàn)。第二參敄17(shù)要跳轄17(zhuǎn)的路径17,如果沒有第二參敄17(shù)則默認跳轄17(zhuǎn)到登陸頁面里添加 為了避免做廣告的嫌疑,以后會把熙魷記3個字去掉亄17〄17 珄17(xiàn)在我們完善登陸和注冊功能〄17 首先,我們要為站點創(chuàng)建一個超級用戶python manage.py createsuperuser然后根據(jù)命令行提示輸入用...
閱讀 3547·2021-09-10 10:51
閱讀 2522·2021-09-07 10:26
閱讀 2499·2021-09-03 10:41
閱讀 823·2019-08-30 15:56
閱讀 2915·2019-08-30 14:16
閱讀 3503·2019-08-30 13:53
閱讀 2118·2019-08-26 13:48
閱讀 1926·2019-08-26 13:37