上传图片与显示图片是Web开发中的一个重要环节。本文是个Django实战小项目,教你如何使用Django自带的通用视图(Generic View)实现图片的上传与显示。我们还会教你如何设置上传路径,以及动态地分配图片名。如果你还不懂什么是通用视图,请阅读我们之前发布的千字长文Django核心基础(3): 视图(View)的编写及通用视图。在你开始练习这个项目前,请确保你使用的是Django 2.0及以上版本,而且你已经通过pip安装好了Python的图片库pillow。
项目分析
我们首先使用django-admin.py startapp pic_upload创建一个小应用app,名叫pic_upload。它将包含3个简单功能性页面:
-
查看图片清单
-
查看图片详情
-
上传新图片
为了简化这个项目,我们的图片将只会有3个属性:标题,图片与上传日期。
第一步:编写模型Model
Django Web开发的第一步永远是编写模型。关于如何正确的编写模型,请看我们原创文章Django核心技术基础(1): Models模型。本项目的pic_upload/models.py代码如下所示。
from django.db import models
from datetime import date
from django.urls import reverse
# Create your models here.
class Picture(models.Model):
title = models.CharField("标题", max_length=100, blank=True, default='')
image = models.ImageField("图片", upload_to="mypictures", blank=True)
date = models.DateField(default=date.today)
def __str__(self):
return self.title
# 对于使用Django自带的通用视图非常重要
def get_absolute_url(self):
return reverse('pic_upload:pic_detail', args=[str(self.id)])
这个模型中有两点是需要值得你注意的:
-
当你使用ImageField或FileField的时候,你必须定义upload_to选项,这是文件上传后所在的文件夹。数据库本身并不存储文件,而只是存储文件的链接。如果项目的媒体文件根目录是media, 那么本例中上传后的图片会被存储在media/mypictures/。