Django之上传图片,分页,三级联动
Django1.8.2中文文档:Django1.8.2中文文档
上传图片
配置上传文件保存目录
1)新建上传文件保存目录。
2)配置上传文件保存目录。
后台管理页面上传图片
- 1)设计模型类。
- 2)迁移生成表格。
- 3) 注册模型类。
后台管理页面上传图片实例
1.在static下面创建media文件夹(再在media文件夹里面新建booktest文件夹)。
2.设置静态文件保存目录
# 设置上传文件的保存目录
MEDIA_ROOT = os.path.join(BASE_DIR, 'static/media')
3.编写图片模型类
class PicTest(models.Model):
"""上传图片"""
goods_pic = models.ImageField(upload_to='booktest') # 指定上传图片到media下面的booktest文件夹下
4.迁移数据
python manage.py makemigrations
python manage.py migrate
如果项目用的是原来的数据库,那么应该先去django_migrations里面删除booktest的init文件;
delete from django_migrations where id = xxx;
如果数据库中原来存在areainfo表,然后项目中的模型类又申请创建,会报错,
解决方法是去booktets/migrations/001init下面删掉重复的表记录。
5.去admin中注册表
admin.site.register(models.PicTest)
这时候,就可以在后台上传图片了。
用户自定义页面上传图片
- 1)定义用户上传图片的页面并显示,是一个自定义的表单。
- 2)定义接收上传文件的视图函数。
request对象有一个FILES的属性,类似于字典,通过request.FILES可以获取上传文件的处理对象。
在django中,上传文件不大于2.5M,文件放在内存中。上传文件大于2.5M,文件内容写到一个临时文件中。
Django处理上传文件的两个类:
FILE_UPLOAD_HANDLERS= (
"django.core.files.uploadhandler.MemoryFileUploadHandler",
"django.core.files.uploadhandler.TemporaryFileUploadHandler")
用户自定义页面上传图片实例
上传图片html--upload_pic.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>上传图片</title>
<meta name="viewport" content="width=device-width, initial-scale=1">
</head>
<body>
<form action="/upload_handle/" method="post" enctype="multipart/form-data">
{% csrf_token %}
<input type="file" name="pic"><br>
<input type="submit" value="上传图片">
</form> </body>
</html>
上传图片对应函数
from django.conf import settings # 上传图片时使用
def upload_pic(request):
"""返回上传图片文件的页面"""
return render(request, 'booktest/upload_pic.html') def upload_handle(request):
"""对上传的文件进行处理"""
# 1.获取上传文件的处理对象
pic = request.FILES['pic']
pic_name = pic.name # 上传文件名
# pic.chunk() # 上传的文件会以迭代器的形式,一部分一部分的保存在这里面
# 2.创建一个文件
save_path = '%s/booktest/%s' % (settings.MEDIA_ROOT, pic_name)
# 3.将上传的文件写入到新创建的文件中
with open(save_path, 'wb') as f:
for content in pic.chunks():
f.write(content)
# 4.记录写入数据库
models.PicTest.objects.create(goods_pic='booktest/%s' % pic_name)
# 5.返回应答
return HttpResponse(pic_name)
配套url
url(r'^upload_pic', views.upload_pic), # 返回上传图片文件的页面
url(r'^upload_handle', views.upload_handle), # 对上传的文件进行处理
分页
需求
查询出所有省级地区的信息,显示在页面上。
1)查询出所有省级地区的信息。
2)按每页显示10条信息进行分页,默认显示第一页的信息,下面并显示出页码。
3)点击i页链接的时候,就显示第i页的省级地区信息。
分页实例
url
url(r'^show_areas(?P<pindex>\d*)', views.show_areas), # 分页
show_areas.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>分页</title>
<meta name="viewport" content="width=device-width, initial-scale=1">
</head>
<body> <ul>
{% for area in page %}
<li>{{ area.atitle }}</li>
{% endfor %}
</ul> {% if page.has_previous %}
<a href="/show_areas{{ page.previous_page_number }}"><上一页</a>
{% endif %} {% for pindex in page.paginator.page_range %}
{% if pindex == page.number %}
{{ pindex }}
{% else %}
<a href="/show_areas{{ pindex }}">{{ pindex }}</a>
{% endif %}
{% endfor %} {% if page.has_next %}
<a href="/show_areas{{ page.next_page_number }}">下一页></a>
{% endif %} </body>
</html>
分页对应函数
from django.core.paginator import Paginator def show_areas(request, pindex):
"""分页"""
# 1.查询出所有省级地区的信息
areas = models.AreaInfo.objects.filter(aParent__isnull=True)
# 2.分页,每页显示10条
pagintor = Paginator(areas, 10)
# 3.获取第pindex页的内容
if pindex == "":
# 默认取第一页的内容
pindex = 1
else:
pindex = int(pindex)
# page是Page类的实例对象
page = pagintor.page(pindex) # 4.使用模板
return render(request, 'booktest/show_areas.html', {'page': page})
三级联动
需求
1)显示省地区信息。
2)省改变时在对应的下拉列表框中显示下级市的信息。
3)市改变时在对应的下拉列表框中显示下级县的信息。
三级联动实例
对应函数
def areas(request):
return render(request, 'booktest/areas.html') def prov(request):
"""返回省级数据"""
# 1.获取所有省级地区的信息
areas = models.AreaInfo.objects.filter(aParent__isnull=True)
# 2.变量areas拼接处json数据:atitle,id
areas_list = []
for area in areas:
areas_list.append((area.id, area.atitle))
return JsonResponse({'data': areas_list}) def city(request, pid):
"""获取pid对应地区的下级地区"""
# 1.获取pid对应地区的下级地区
# area = models.AreaInfo.objects.filter(id=pid)
# areas = area.areainfo_set.all()
areas = models.AreaInfo.objects.filter(aParent__id=pid)
# 2.变量areas拼接处json数据:atitle,id
areas_list = []
for area in areas:
areas_list.append((area.id, area.atitle))
return JsonResponse({'data': areas_list})
url
url(r'^prov', views.prov), # 返回省级数据
url(r'^city(\d+)', views.city), # 返回市级数据
url(r'^dis(\d+)', views.city), # 返回县级数据
area.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>省市县案例</title>
<meta name="viewport" content="width=device-width, initial-scale=1">
<script src="/static/js/jquery-3.3.1.js"></script>
<script>
$(function () {
// 发起一个ajax请求/prov, 获取所有省级地区的信息
// 获取信息,使用get;涉及到信息修改,使用post
$.get('/prov', function (data) {
// 回调函数
// 获取返回的json数据
let res = data.data;
// 获取prov下拉列表框
let prov = $('#prov');
// 遍历res数组,获取每一个元素: [地区id,地区标题]
for(let i=0; i<res.length; i++) {
let id = res[i][0];
let atitle = res[i][1];
let option_str = "<option value='"+ id +"'>" + atitle + "</option>";
// 向prov下拉列表框中追加元素
prov.append(option_str)
}
}); // 绑定prov下拉框的change事件,获取省下面市的信息
$('#prov').change(function () {
let prov_id = $(this).val();
$.get('/city'+prov_id, function (data) {
let res = data.data;
let city = $('#city');
city.empty().append('<option>---请选择市---</option>');
let dis = $('#dis');
dis.empty().append('<option>---请选择县---</option>');
$.each(res, function (index, item) {
let id = item[0];
let atitle = item[1];
let option_str = "<option value='"+ id +"'>" + atitle + "</option>";
// 向city下拉列表框中追加元素
city.append(option_str)
})
})
}); // 绑定prov下拉框的change事件,获取省下面市的信息
$('#city').change(function () {
let city_id = $(this).val();
$.get('/dis'+city_id, function (data) {
let res = data.data;
let dis = $('#dis');
dis.empty().append('<option>---请选择县---</option>');
$.each(res, function (index, item) {
let id = item[0];
let atitle = item[1];
let option_str = "<option value='"+ id +"'>" + atitle + "</option>";
// 向city下拉列表框中追加元素
dis.append(option_str)
})
})
});
})
</script>
</head>
<body>
<select id="prov">
<option>---请选择省---</option> </select>
<select id="city">
<option>---请选择市---</option>
</select>
<select id="dis">
<option>---请选择县---</option>
</select>
</body>
</html>
Django之上传图片,分页,三级联动的更多相关文章
- Django积木块八——三级联动
三级联动 前端需要的效果,省之后市之后现,创建model,查询所有的省的信息,json传到前面,之后通过省的id找到对应的市,是用异步实现的. # model class Sheng(models.M ...
- django项目中cxselect三级联动
下载cxselect插件放在static文件夹下 前端引入 <script src="/static/js/jQuery-1.8.2.min.js"></scri ...
- Django Admin实现三级联动(省市区)
通过自定义Admin的模板文件实现省市区的三级联动.要求创建记录时,根据省>市>区的顺序选择依次显示对应数据. 修改记录时默认显示已存在的数据. Model class Member(mo ...
- Django Admin 实现三级联动的示例代码(省市区)===>小白级
一 使用环境 开发系统: windows IDE: pycharm 数据库: msyql,navicat 编程语言: python3.7 (Windows x86-64 executable in ...
- 在使用ajax实现三级联动调用数据库数据并通过调出的数据进行二级表单查询
在使用ajax实现三级联动查询数据库数据后再使用ajax无刷新方式使用三级联动调出的数据进行二级查询 但是现在遇到问题,在二级查询的时候期望是将数据以表格的形式展示在三级联动的下方,但是现在在查询后会 ...
- 2019.03.25 Ajax三级联动
所谓三级联动就是,一层接着一层,根据上一层的选择给出这一层的结果 如选择市之后,会给出相应的区,然后到相应的县这就是联动 配置视图 from django.core import serialize ...
- js封装的三级联动菜单(使用时只需要一行js代码)
前言 在实际的项目开发中,我们经常需要三级联动,比如省市区的选择,商品的三级分类的选择等等. 而网上却找不到一个代码完整.功能强大.使用简单的三级联动菜单,大都只是简单的讲了一下实现思路. 下面就给大 ...
- 利用select实现年月日三级联动的日期选择效果
× 目录 [1]演示 [2]规划 [3]结构生成[4]算法处理 前面的话 关于select控件,可能年月日三级联动的日期选择效果是最常见的应用了.本文是选择框脚本的实践,下面将对日期选择效果进行详细介 ...
- jQuery省市区三级联动插件
体验效果:http://hovertree.com/texiao/bootstrap/4/支持PC和手机移动端. 手机扫描二维码体验效果: 代码如下: <!DOCTYPE html> &l ...
随机推荐
- iOS 图解弹幕功能的实现
先来看一张效果图(LICEcap录制的有点卡, 凑合看) 理一下大概流程: 接下来实现: 弹幕视图从底部弹上来, 依次动画向上滚动, 出屏幕就移除加入重用队列, 下次使用. 定义相关属性: 1. 根据 ...
- C语言中的“>>”和“
先说左移,左移就是把一个数的所有位都向左移动若干位,在C中用<<运算符.例如: int i = 1; i = i << 2; //把i里的值左移2位 也就是说,1的2进制是00 ...
- 小白学python-day04-运算符、while循环相关
今天是day04.以下是学习总结. 但行努力,莫问前程. ----------------------------------------------------------------------- ...
- Java编程基础阶段笔记 day01 Java语言概述
目录内容 DOS命令 电脑配置 Java语言的特性 Java两种核心机制 Java语言环境搭建 第一个Java程序 注释 Java语句说明 编程风格 作业 常用的DOS命令 dir : 列出当 ...
- SpringMVC简易架构图。。。
DispatcherServlet拦截所有请求 -> 通过访问url路径找到对应的控制器 -> 通过适配器调用控制器的方法 -> 控制器里面的方法处理业务 -> 通过视图解析器 ...
- containsObject 总是不含有,你会用吗
结论:containsObject:是在比较内存地址,即使两个对象内容完全一样,地址不同,那也是不同的.我个人认为这个方法应该叫是否存在同一个对象 (开始不知道这个知识,被坑,至少浪费了3个钟头,数组 ...
- Hadoop自学系列集(三) ---- Hadoop安装
这节就开始讲述Hadoop的安装吧.在这之前先配置下SSH免密码登录,为什么需要配置这个呢?大家都知道Hadoop集群中可能有几十台机器甚至是上千台机器,而每次启动Hadoop都需要输入密码才能够登录 ...
- Linux学习笔记06之DNS
一.DNS概念:Domain Name System(域名系统) 是互联网上作为域名和IP地址相互映射的一个分布式数据库 二.DNS功能: 完成IP地址和域名之间的一个映射 三.DNS分类: 1.静态 ...
- QTableView表格控件区域选择-自绘选择区域
目录 一.开心一刻 二.概述 三.效果展示 四.实现思路 1.绘制区域 2.绘制边框 3.绘制 五.相关文章 原文链接:QTableView表格控件区域选择-自绘选择区域 一.开心一刻 陪完客户回到家 ...
- (转)Linux LVM逻辑卷配置过程详解(创建、扩展、缩减、删除、卸载、快照创建)
一.预备知识 LVM全称为Logical Volume Manager 逻辑卷管理器,LVM是Linux环境中对磁盘分区进行管理的一种机制,是建立在硬盘和分区之上.文件系统之下的一个逻辑层,可提高磁盘 ...