专栏首页Python程序员杂谈django 自定义后台图片上传

django 自定义后台图片上传

今天终于是抽时间完成了后台上传图片的功能,确切的说是上传文件的功能。终于可以在blog方便的插入自己的图片了,之前不做这个功能是觉得服务器在国外,弄个图片上去图片的加载速度应该会很慢,会让人产生这个网站很慢的错觉。

前一段时间又拍云给了个邮件,请求资源置换,具体方案就是我博客下方放他们一个链接,然后我就有了个不限期的存储空间。我觉得应该算是互相得益的交易。 这里也广播下,欢迎其他资源提供商前来洽谈,^_^。

说回正题,如果只是存在自己服务器上,那就挺简单了,只用个FileField或者ImageField,然后django自己的后台就搞定了,如果有像我这样需求的话,就要使用自定义的storage了。官方文档参考这里: https://docs.djangoproject.com/en/1.5/howto/custom-file-storage/

自定义的storage也很简单,只要实现storage的几个方法就行了,主要是_save:

.. code:: python

import upyun
from django.db import models
from django.core.files.storage import Storage
from django.utils.six.moves.urllib.parse import urljoin
from django.utils.encoding import filepath_to_uri


class UpyunStorage(Storage):

    BUCKETNAME = 'xxxx'
    USERNAME = 'the5fire'
    PASSWORD = 'xxxxxx'
    BASE_URL = "http://xxxxx.b0.upaiyun.com"
    up = upyun.UpYun(BUCKETNAME, USERNAME, PASSWORD, timeout=30,
                                        endpoint=upyun.ED_AUTO)

    def _save(self, name, content):
        full_url = self.BASE_URL  + name
        try:
            res = self.up.put(name, content.read(), checksum=False)
        except Exception as e:
            raise

        return full_url

    def exists(self, name):
        try:
            self.up.getinfo(name)
        except Exception:
            return False
        return True

    def listdir(self, path):
        pass

    def size(self, name):
        return 0

    def url(self, name):
        return urljoin(self.BASE_URL, filepath_to_uri(name))


class StaticFile(models.Model):
    name = models.CharField(max_length=40, blank=True, verbose_name=u'名称')
    url = models.FileField(upload_to="/staticfile", storage=UpyunStorage(), verbose_name=u'URL')

    create_time = models.DateTimeField(u'创建时间', auto_now_add=True)

就这么个代码就ok了,需求比较简单。另外也重写了对应的admin list页面,有同样需求的同学可以参考下,因为我想在列表页直接上传文件,而不是每次都要进入增加的页面。这个需求主要有两个地方需要重写,一是对应staticfile的admin类,二是对应的change_list.html这个模板(在django/contrib/admin/templates/admin下)。对应的代码如下:

admin.py:

.. code:: python

#coding:utf-8
from django.contrib import admin

from .models import StaticFile


class StaticFileAdmin(admin.ModelAdmin):

    change_list_template = "admin/model_list.html"    # 就是它
    search_fields = ('name', 'url')
    fields = ('name', 'url')
    list_display = ('name', 'url', 'create_time')
    actions_on_top = False


admin.site.register(StaticFile, StaticFileAdmin)

model_list.html:

.. code:: html

{% extends "admin/change_list.html" %}

{% block filters %}
<div>
    <h6>文件上传:</h6>
    <form enctype="multipart/form-data" action="add/" method="post" id="staticfile_form">
            {% csrf_token %}
            <label for="id_name">名称:</label>
            <input class="vTextField" id="id_name" maxlength="40" name="name" type="text" />
            <label for="id_url" class="required">URL:</label>

            <input id="id_url" name="url" type="file" />
            <input type="submit" value="保存" name="_save" />
    </form>
</div>
<br/>
<br/>

{{ super }}
{% endblock %}

最后的界面是这个样子的:

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Struts2之Validation的简单使用实例

    本来不打算写这些细枝末节的东西了,因为在文档中都有现成的实例,写了也只能自己用来参考,不过这个Validation文档中给的不全,从网上查之后才知道用法。 首先...

    the5fire
  • python项目练习三:万能的XML

    这个项目的名称与其叫做万能的XML不如叫做自动构建网站,根据一份XML文件,生成对应目录结构的网站,不过只有html还是太过于简单了,如果要是可以连带生成css...

    the5fire
  • Struts2 Wildcard 和DMI

    关于Struts2 Action中的最基本method配置我就不说,那个比较死板。关于这个method有两个动态调用Action方法的方法:WildCard(...

    the5fire
  • Python3 面向对象概述

    Python从设计之初就已经是一门面向对象的语言,所以我们可以以面向对象的方式去编写python代码。面向对象就是将任何事情都当做对象去看待,一个对象会拥有属性...

    py3study
  • scrapy 传参

    shengjk1
  • Java的内存机制

    Java 把内存划分成两种:一种是栈内存,另一种是堆内存。在函数中定义的一些基本类型的变量和对象的引用变量都是在函数的栈内存中分配,当在一段代码块定义一个变量时...

    飞奔去旅行
  • python过滤敏感词记录

    关于敏感词过滤可以看成是一种文本反垃圾算法,例如 题目:敏感词文本文件 filtered_words.txt,当用户输入敏感词语,则用 星号 * 替换,例如当...

    学到老
  • Python Web Flask源码解读(三)——模板渲染过程

    前面对 Flask启动流程和路由原理都进行了源码走读。今天我们看看模板渲染的过程。

    阳仔
  • 用最简单的例子和最通俗的语言解释单进程和多进程

    采用网上的一个利用复制文件来检测多进程和单进程差异的例子。但是例子中许多关键的解释并未给出,反而给入门新手造成了很多不必要的困扰和门槛。

    一个有趣的灵魂W
  • 手机页面的一些有用的meta

    Joel

扫码关注云+社区

领取腾讯云代金券