一.上传图片
1.安装依赖
- 在python中进行图片操作,需要安装包PIL。
pip install Pillow==3.4.1
- 在Django中上传图片包括两种方式:
1.在管理页面admin中上传图片
2.自定义form表单中上传图片
上传图片后,将图片存储在服务器上,然后将图片的路径存储在表中。
2.创建包含图片的模型类
将模型类的属性定义成models.ImageField类型
- 打开test3/booktest/models.py文件,定义模型类PicTest。
class PicTest(models.Model):
pic = models.ImageField(upload_to='booktest/')
-
回到命令行中,生成迁移。(当我们形成迁移文件的时候,我们可以在TOOLS命令行中进行迁移,上个文章中有说明)
makemigrations booktest
migrate booktest

-
当我们打开test2数据库,可以看到新生成的表
3.在管理页面admin中上传图片
- 启动服务
- 进入管理用户界面:http://127.0.0.1:8000/admin
-
创建超级用户(createsuperuser)
-
刷新邓丽页面进行登陆
- 注册模型类
- 进入bootest/admin.py文件
from booktest.models import PicTest
admin.site.register(PicTest)
-
刷新后台管理界面
-
下载图片并上传
我们下载一个图片,并且进行文件夹上传
-
刷新数据库
-
查找图片
-
创建一个media文件夹来保存图片
- 打开test4/settings.py文件,设置图片保存路径。
MEDIA_ROOT = os.path.join(BASE_DIR, 'static/media')
-
我们再次上传图片
-
图片保存的目录是我们想要的
4.自定义form表单中上传图片
- 打开booktest/urls.py文件,配置url。
url(r'^pic_upload/$', views.pic_upload),
- 打开booktest/views.py文件,创建视图pic_upload。
#显示图片上传UI界面
def pic_upload(request):
return render(request,'booktest/pic_upload.html')
- 在templates/booktest/目录下创建模板pic_upload.html。
- 在模板中定义上传表单,要求如下:
1.form的属性enctype="multipart/form-data"
2.form的method为post
3.input的类型为file
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="/pic_handle/" method="post" enctype="multipart/form-data">
{% csrf_token %}
<input type="file" name="pic"><br>
<input type="submit" value="上传">
</form>
</body>
</html>
- 打开booktest/urls.py文件,配置url。
url(r'^pic_handle/$', views.pic_handle),
- 打开booktest/views.py文件,创建视图pic_handle,用于接收表单保存图片。
request对象的FILES属性用于接收请求的文件,包括图片。
from django.conf import settings
from django.http import HttpResponse
def pic_handle(request):
"""
上传图片的处理
:param request:
:return:
"""
pic = request.FILES.get('pic')
# 返回图片的名字
print(pic.name)
# 把图片存入到 static文件夹下的media目录
# 指定图片的存储路径 static/media/ booktest
save_path = '{}/booktest/{}'.format(settings.MEDIA_ROOT, pic.name)
# 文件进行写入
with open(save_path, 'wb') as f:
for content in pic.chunks():
f.write(content)
# 在数据库中保存上传记录
PicTest.objects.create(pic= 'booktest/{}'.format(pic.name))
return HttpResponse('ok')
- 运行服务器,在浏览器中输入如下网址:
http://127.0.0.1:8000/pic_upload/
点击上传后显示:
-
打开media目录
-
打开数据库
5.显示照片
- 修改pic_handle
def pic_handle(request):
"""
上传图片的处理
:param request:
:return:
"""
pic = request.FILES.get('pic')
# 返回图片的名字
print(pic.name)
# 把图片存入到 static文件夹下的media目录
# 指定图片的存储路径 static/media/ booktest
save_path = '{}/booktest/{}'.format(settings.MEDIA_ROOT, pic.name)
# 文件进行写入
with open(save_path, 'wb') as f:
for content in pic.chunks():
f.write(content)
# 在数据库中保存上传记录
pic_Test = PicTest.objects.create(pic= 'booktest/{}'.format(pic.name))
#从数据中调取刚才上传图片的路径
print(pic_Test.pic)
context = {'pic': pic_Test}
return render(request,'booktest/pic_show.html',context=context)

- 在templates/booktest/目录下创建模板pic_show.html。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<img style="width: 300px; height: 200px" src="/static/media/{{ pic.pic}}" alt="图片加载失败">
</body>
</html>
-
刷新网页,进行上传
二.分页
Django提供了数据分页的类,这些类被定义在django/core/paginator.py中。 类Paginator用于对列进行一页n条数据的分页运算。类Page用于表示第m页的数据。
1.Paginator类实例对象
- 方法init(列表,int):返回分页对象,第一个参数为列表数据,第二个参数为每页数据的条数。
- 属性count:返回对象总数。
- 属性num_pages:返回页面总数。
- 属性page_range:返回页码列表,从1开始,例如[1, 2, 3, 4]。
- 方法page(m):返回Page类实例对象,表示第m页的数据,下标以1开始。
2.Page类实例对象
- 调用Paginator对象的page()方法返回Page对象,不需要手动构造。
- 属性object_list:返回当前页对象的列表。
- 属性number:返回当前是第几页,从1开始。
- 属性paginator:当前页对应的Paginator对象。
- 方法has_next():如果有下一页返回True。
- 方法has_previous():如果有上一页返回True。
- 方法len():返回当前页面对象的个数。
3.示例
- 在areatest/urls.py文件中配置url。
url(r'^page(?P<pIndex>[0-9]*)/$', views.page_test),
- 在areatest/views.py文件中创建视图page_test。
from django.shortcuts import render
from areatest.models import AreaInfo
from django.http import HttpResponse
from django.core.paginator import Paginator
# Create your views here.
def page_test(request, pIndex):
#查询所有地区信息
list1 = AreaInfo.objects.filter(aParent__isnull=True)
#将地区信息按一页10条进行分页
p = Paginator(list1,10)
#如果当前没有传递页码信息,则认为是第一页,这样写是为了请求第一页时可以不写代码
if pIndex == '':
pIndex = '1'
#通过url匹配的参数都是字符串类型,转换成int类型
pIndex = int(pIndex)
#获取第pIndex页的数据
list2 = p.page(pIndex)
#获取所有页码信息
plist = p.page_range
#将当前页码,当前页的数据,页码信息传递到模板中
return render(request,'areatest/page_test.html',{'list':list2,'plist':plist,'pIndex':pIndex})
- 在templates/areatest/目录下创建page_test.html模板文件。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
显示当前页的地区信息:<br>
<ul>
{% for area in list %}
<li>{{ area.id }}-----------{{ area.atitle }}</li>
{% endfor %}
</ul>
<hr>
显示页码信息:当前页码没有链接,其他页码有链接<br>
{% for pindex in plist %}
{% if pIndex == pindex %}
{{ pindex }}
{% else %}
<a href="/page{{ pindex }}/">{{ pindex }}</a>
{% endif %}
{% endfor %}
</body>
</html>
- 运行服务器,在浏览器中输入如下网址:http://127.0.0.1:8000/page/
-
显示所有

(此文章仅作为个人学习笔记使用,如有错误欢迎指正~)


















