django中上传图片分页三级联动效果的实现代码


Posted in Python onAugust 30, 2019

Django1.8.2中文文档:Django1.8.2中文文档

上传图片配置上传文件保存目录

1)新建上传文件保存目录。

django中上传图片分页三级联动效果的实现代码

2)配置上传文件保存目录。

django中上传图片分页三级联动效果的实现代码

后台管理页面上传图片

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中上传图片分页三级联动效果的实现代码,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

Python 相关文章推荐
python插入数据到列表的方法
Apr 30 Python
Python读写unicode文件的方法
Jul 10 Python
Python 实现一个颜色色值转换的小工具
Dec 06 Python
详谈python http长连接客户端
Jun 12 Python
python利用正则表达式排除集合中字符的功能示例
Oct 10 Python
在python中按照特定顺序访问字典的方法详解
Dec 14 Python
Django渲染Markdown文章目录的方法示例
Jan 02 Python
python 同时运行多个程序的实例
Jan 07 Python
利用Python复制文件的9种方法总结
Sep 02 Python
解决python执行较大excel文件openpyxl慢问题
May 15 Python
Python 实现 T00ls 自动签到脚本代码(邮件+钉钉通知)
Jul 06 Python
3分钟看懂Python后端必须知道的Django的信号机制
Jul 26 Python
python实现生成Word、docx文件的方法分析
Aug 30 #Python
python解析yaml文件过程详解
Aug 30 #Python
详细整理python 字符串(str)与列表(list)以及数组(array)之间的转换方法
Aug 30 #Python
python数据持久存储 pickle模块的基本使用方法解析
Aug 30 #Python
python 命令行传入参数实现解析
Aug 30 #Python
Python 在OpenCV里实现仿射变换—坐标变换效果
Aug 30 #Python
python在OpenCV里实现投影变换效果
Aug 30 #Python
You might like
php二维数组排序方法(array_multisort usort)
2013/12/25 PHP
php foreach正序倒序输出示例代码
2014/07/01 PHP
WIN8.1下搭建PHP5.6环境
2015/04/29 PHP
PHP删除二维数组中相同元素及数组重复值的方法示例
2017/05/05 PHP
laravel 中如何使用ajax和vue总结
2017/08/16 PHP
JXTree对象,读取外部xml文件数据,生成树的函数
2007/04/02 Javascript
jquery ui 1.7 ui.tabs 动态添加与关闭(按钮关闭+双击关闭)
2010/04/01 Javascript
深入探密Javascript数组方法
2015/01/08 Javascript
js判断一个字符串是否包含一个子串的方法
2015/01/26 Javascript
JS实现漂亮的淡蓝色滑动门效果代码
2015/09/23 Javascript
微信小程序中单位rpx和rem的使用
2016/12/06 Javascript
JS实现全屏的四种写法
2016/12/30 Javascript
nodejs个人博客开发第四步 数据模型
2017/04/12 NodeJs
vue 封装自定义组件之tabal列表编辑单元格组件实例代码
2017/09/07 Javascript
React-Native使用Mobx实现购物车功能
2017/09/14 Javascript
动手写一个angular版本的Message组件的方法
2017/12/16 Javascript
layui中使用jquery控制radio选中事件的示例代码
2018/08/15 jQuery
JavaScript设计模式之观察者模式实例详解
2019/01/16 Javascript
详解vue中的父子传值双向绑定及数据更新问题
2019/06/13 Javascript
javascript 代码是如何被压缩的示例代码
2020/05/06 Javascript
Python Socket传输文件示例
2017/01/16 Python
使用Turtle画正螺旋线的方法
2017/09/22 Python
python实现机械分词之逆向最大匹配算法代码示例
2017/12/13 Python
Python逐行读取文件中内容的简单方法
2019/02/26 Python
使用Python脚本从文件读取数据代码实例
2020/01/19 Python
Python 如何测试文件是否存在
2020/07/31 Python
Python调用高德API实现批量地址转经纬度并写入表格的功能
2021/01/12 Python
利用Python过滤相似文本的简单方法示例
2021/02/03 Python
荷兰男士时尚网上商店:Suitable
2017/12/25 全球购物
美国时尚大码女装购物网站:Avenue
2019/05/24 全球购物
俄罗斯最大的香水和化妆品网上商店:Randewoo
2020/11/05 全球购物
中专生毕业个人鉴定
2014/02/26 职场文书
工地安全质量标语
2014/06/07 职场文书
护理专业求职信
2014/06/15 职场文书
新教师个人工作总结
2015/02/06 职场文书
巴黎圣母院读书笔记
2015/06/26 职场文书