Django xAdmin中使用七牛上傳文件

摘要:公司項目使用七牛云存儲文件,而項目控制臺基于DjangoAdmin開發(fā),現(xiàn)在有個需求要在控制臺中直接上傳文件到七牛,所以自己就寫了一個DjangoAPP:qiniu_fields用來實現(xiàn)這個功能犀农。這里記錄&;分享一下厕氨。一、技術方案Django本身支持自定義Model字段,為了實現(xiàn)需求,我在URLField和TextField的基礎上實現(xiàn)自定義字段,同時重寫其對應的Widget李根。二、qiniu_fieldsAPP具體代碼如下:widgets.py#!-*-coding:

公司項目使用七牛云存儲文件,而項目控制臺基于 Django Admin 開發(fā),現(xiàn)在有個需求要在控制臺中直接上傳文件到七牛,所以自己就寫了一個 Django APP:qiniu_fields 用來實現(xiàn)這個功能笨触。這里記錄 &; 分享一下裕菠。

一妄壶、技術方案?

Django 本身支持自定義 Model 字段,為了實現(xiàn)需求,我在 URLField 和 TextField 的基礎上實現(xiàn)自定義字段,同時重寫其對應的 Widget濒持。

二键耕、qiniu_fields APP?

具體代碼如下:

widgets.py

#! -*- coding: utf-8 -*-?

from django import forms?

from django.conf import settings?

from django.utils.html import smart_urlquote?

class QiniuFileWidget(forms.URLInput):?

input_type = 'file'?

template_name = 'file.html'?

def __init__(self, attrs=None):?

final_attrs = {?

'domain': settings.QINIU_DOMAIN,?

'uptoken_url': settings.QINIU_UPTOKEN_URL,?

}?

if attrs is not None:?

final_attrs.update(attrs)?

super(QiniuFileWidget, self).__init__(attrs=final_attrs)?

def get_context(self, name, value, attrs):?

context = super(QiniuFileWidget, self).get_context(name, value, attrs)?

context['current_label'] = '當前:'?

context['widget']['href'] = smart_urlquote(context['widget']['value']) if value else ''?

return context?

@property?

def media(self):?

return forms.Media(js=('qiniu_fields/plupload/plupload.full.min.js', 'qiniu_fields/plupload/i18n/zh_CN.js',?

'qiniu_fields/qiniu/qiniu.min.js', 'qiniu_fields/qiniu/ui.min.js'))?

# class Media:?

# js = ('qiniu_fields/plupload/plupload.full.min.js', 'qiniu_fields/plupload/i18n/zh_CN.js',?

# 'qiniu_fields/qiniu/qiniu.min.js', 'qiniu_fields/qiniu/ui.min.js')?

class QiniuFileListWidget(forms.Textarea):?

template_name = 'file_list.html'?

def __init__(self, attrs=None):?

final_attrs = {?

'domain': settings.QINIU_DOMAIN,?

'uptoken_url': settings.QINIU_UPTOKEN_URL,?

}?

if attrs is not None:?

final_attrs.update(attrs)?

super(QiniuFileListWidget, self).__init__(attrs=final_attrs)?

@property?

def media(self):?

return forms.Media(js=('qiniu_fields/plupload/plupload.full.min.js', 'qiniu_fields/plupload/i18n/zh_CN.js',?

'qiniu_fields/qiniu/qiniu.min.js', 'qiniu_fields/qiniu/ui.min.js'))?

# class Media:?

# js = ('qiniu_fields/plupload/plupload.full.min.js', 'qiniu_fields/plupload/i18n/zh_CN.js',?

# 'qiniu_fields/qiniu/qiniu.min.js', 'qiniu_fields/qiniu/ui.min.js')?

forms.py

#! -*- coding: utf-8 -*-?

from django import forms?

from .widgets import QiniuFileWidget, QiniuFileListWidget?

class QiniuFileFormField(forms.URLField):?

prefix = ''?

file_type = 'all'?

widget = QiniuFileWidget?

def __init__(self, *args, **kwargs):?

kwargs["widget"] = QiniuFileWidget(attrs={'prefix': self.prefix, 'file_type': self.file_type})?

super(QiniuFileFormField, self).__init__(*args, **kwargs)?

fields.py

#! -*- coding: utf-8 -*-?

from django.db import models?

from .widgets import QiniuFileWidget, QiniuFileListWidget?

from .forms import QiniuFileFormField?

class QiniuFileField(models.URLField):?

widget_clz = QiniuFileWidget?

form_field_clz = QiniuFileFormField?

def __init__(self, verbose_name=None, name=None, prefix='', file_type='all', **kwargs):?

self.prefix = prefix?

self.file_type = file_type?

kwargs['max_length'] = 500?

super(QiniuFileField, self).__init__(verbose_name, name, **kwargs)?

def formfield(self, **kwargs):?

self.form_field_clz.prefix = self.prefix?

self.form_field_clz.file_type = self.file_type?

kwargs.update({?

'form_class': self.form_field_clz,?

'widget': self.widget_clz(attrs={'prefix': self.prefix, 'file_type': self.file_type})?

})?

return super(QiniuFileField, self).formfield(**kwargs)?

class QiniuFileListField(models.TextField):?

def __init__(self, *args, prefix='', file_type='all', **kwargs):?

self.prefix = prefix?

self.file_type = file_type?

super(QiniuFileListField, self).__init__(*args, **kwargs)?

def formfield(self, **kwargs):?

kwargs.update({?

'widget': QiniuFileListWidget(attrs={'prefix': self.prefix, 'file_type': self.file_type}),?

})?

return super(QiniuFileListField, self).formfield(**kwargs)?

三、項目Demo?

Django Qiniu Fields代碼和 Demo 項目見Github:django-qiniu-fields

Over!

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末柑营,一起剝皮案震驚了整個濱河市屈雄,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌官套,老刑警劉巖酒奶,帶你破解...
    沈念sama閱讀 222,000評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異奶赔,居然都是意外死亡惋嚎,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,745評論 3 399
  • 文/潘曉璐 我一進店門站刑,熙熙樓的掌柜王于貴愁眉苦臉地迎上來另伍,“玉大人,你說我怎么就攤上這事绞旅“诔ⅲ” “怎么了?”我有些...
    開封第一講書人閱讀 168,561評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我躁劣,道長,這世上最難降的妖魔是什么讯检? 我笑而不...
    開封第一講書人閱讀 59,782評論 1 298
  • 正文 為了忘掉前任,我火速辦了婚禮卫旱,結果婚禮上人灼,老公的妹妹穿的比我還像新娘。我一直安慰自己顾翼,他們只是感情好挡毅,可當我...
    茶點故事閱讀 68,798評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著暴构,像睡著了一般。 火紅的嫁衣襯著肌膚如雪段磨。 梳的紋絲不亂的頭發(fā)上取逾,一...
    開封第一講書人閱讀 52,394評論 1 310
  • 那天,我揣著相機與錄音苹支,去河邊找鬼砾隅。 笑死,一個胖子當著我的面吹牛债蜜,可吹牛的內容都是我干的晴埂。 我是一名探鬼主播究反,決...
    沈念sama閱讀 40,952評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼儒洛!你這毒婦竟也來了精耐?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,852評論 0 276
  • 序言:老撾萬榮一對情侶失蹤琅锻,失蹤者是張志新(化名)和其女友劉穎卦停,沒想到半個月后,有當地人在樹林里發(fā)現(xiàn)了一具尸體恼蓬,經...
    沈念sama閱讀 46,409評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡惊完,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,483評論 3 341
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了处硬。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片小槐。...
    茶點故事閱讀 40,615評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖荷辕,靈堂內的尸體忽然破棺而出凿跳,到底是詐尸還是另有隱情,我是刑警寧澤桐腌,帶...
    沈念sama閱讀 36,303評論 5 350
  • 正文 年R本政府宣布拄显,位于F島的核電站,受9級特大地震影響案站,放射性物質發(fā)生泄漏躬审。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,979評論 3 334
  • 文/蒙蒙 一蟆盐、第九天 我趴在偏房一處隱蔽的房頂上張望承边。 院中可真熱鬧,春花似錦石挂、人聲如沸博助。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,470評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽富岳。三九已至,卻和暖如春拯腮,著一層夾襖步出監(jiān)牢的瞬間窖式,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,571評論 1 272
  • 我被黑心中介騙來泰國打工动壤, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留萝喘,地道東北人。 一個月前我還...
    沈念sama閱讀 49,041評論 3 377
  • 正文 我出身青樓,卻偏偏與公主長得像阁簸,于是被迫代替她去往敵國和親爬早。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,630評論 2 359

推薦閱讀更多精彩內容

  • 新手求助启妹,windows版本的python沒有termios這個模塊是沒有筛严。如果想在windows下跑,得裝cyg...
    夏天夏星閱讀 2,659評論 0 1
  • 一优幸、FBV & CBV CBV定義 Djanggo中的請求處理方式FBV: Function Bas...
    likethebluebird閱讀 546評論 0 0
  • 子女是父母最珍惜的人,希望我們能幸福褪猛,能過得好网杆!而且這么多人這么多的家庭,為什么就不覺得自己重要呢伊滋?因為你也是其中...
    天外之音閱讀 175評論 0 0
  • 可能對人類的發(fā)展定義不深碳却,對于科技的發(fā)展未知不強,所以有時候看不懂一些大片笑旺。 文|念仔 這部電影是由日本動漫改編昼浦,...
    劉小盜閱讀 315評論 0 0
  • 內容為王,拿什么才算優(yōu)質的內容 你的生活上的正能量筒主,不管是生活體悟還是心靈雞湯关噪, 一定要和你有關,朋友圈嗎主要還是...
    熊芳菲閱讀 700評論 0 2