瀑布流

  瀑布流,又称瀑布流式布局。是比较流行的一种网站页面布局,视觉表现为参差不齐的多栏布局,随着页面滚动条向下滚动,这种布局还会不断加载数据块并附加至当前尾部。最早采用此布局的网站是Pinterest,逐渐在国内流行开来。国内大多数清新站基本为这类风格。

实现效果:

数据存放方式:

实现方式一: 自定义模版语言(simple_tag)

思路: 后端获取数据,,前端页面使用自定义模板语言,实现第一条数据放第一个div,...,(通过求余数实现),返回标签字符串,页面显示.

实现方法:

1.在app中创建templatetags模块

2.创建任意 .py 文件,如:newtag.py

from django import template
from django.utils.safestring import mark_safe register = template.Library()

3.后台获取数据

def student(request):
queryset_dict = models.StudentDetail.objects.filter(student__status=1).values('letter_of_thanks','student__name','student__pic','student__company','student__salary') return render(request,'home.html',{'queryset_dict':queryset_dict})

4.前端使用模板语言 for循环得到每一个item数据

<div style="width: 245px;float: left">
{% for item in queryset_dict %}
....
{% endfor %}
</div>

5.自定义模版语言,

实现:传入item数据 , 当前循环的次数 , => 通过次数 , 求余判断, 数据放在div1 还是div2 ,.... ,

@register.simple_tag
def image_show(item,counter,allcount,remainder):
'''
:param item: 当前循环获取的数据
:param counter: 当前循环次数(模版语言for循环默认从1开始)
:param allcount: 页面分布列数
:param remainder: 余数
:return:
'''
TEMP = '''
<div style="width: 245px;" >
<img src="/%s" alt="" style="width: 245px;height: 250px">
<p>%s</p>
<p>%s</p>
</div>
'''
if counter%allcount == remainder:
TEMP = TEMP %(item['student__pic'],
item['student__name'],
item['letter_of_thanks'],
)
return mark_safe(TEMP)
else:
return ''

注意:模版语言默认会返回None , 所以要设置返回空字符串

6.前端调用:

<div style="width: 245px;float: left">
{% for item in queryset_dict %}
{% image_show item forloop.counter 4 1 %}
{% endfor %}
</div>

forloop.counter 获取当前循环的次数 (默认从1开始递增!)

7.div2,div3,div4 同上

完整代码:

from django import template
from django.utils.safestring import mark_safe register = template.Library() @register.simple_tag
def image_show(item,counter,allcount,remainder):
'''
:param item: 当前循环获取的数据
:param counter: 当前循环次数(模版语言for循环默认从1开始)
:param allcount: 页面分布列数
:param remainder: 余数
:return:
''' TEMP = '''
<div style="width: 245px;" >
<img src="/%s" alt="" style="width: 245px;height: 250px">
<p>%s</p>
<p>%s</p>
</div>
'''
if counter%allcount == remainder:
TEMP = TEMP %(item['student__pic'],
item['student__name'],
item['letter_of_thanks'],
)
return mark_safe(TEMP)
else:
return ''

自定义模版语言

{% load newtag %}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style>
.clearfix:after{
content: 'x';
height: 0;
visibility: hidden;
clear: both;
display: block;
}
.stu{
margin:0 auto;
width: 980px;
}
</style>
</head>
<body> <div class="clearfix stu">
<div style="width: 245px;float: left">
{% for item in queryset_dict %}
{% image_show item forloop.counter 4 1 %}
{% endfor %}
</div>
<div style="width: 245px;float: left">
{% for item in queryset_dict %}
{% image_show item forloop.counter 4 2 %}
{% endfor %}
</div>
<div style="width: 245px;float: left">
{% for item in queryset_dict %}
{% image_show item forloop.counter 4 3 %}
{% endfor %}
</div>
<div style="width: 245px;float: left">
{% for item in queryset_dict %}
{% image_show item forloop.counter 4 0 %}
{% endfor %}
</div>
</div>
</body>
</html>

前端页面

实现方式二: 自定义模版语言(filter)

区别:

1.自定义的模版语言使用filter 而不是simple_tag

2.自定义的filter 支持if 条件判断来使用! , 而 simple_tag不支持

{% if  filter模版语言返回结果  %}
...
{% endif %} 或 {{ filter模版语言 }}

前端设计思路:

1.如果if条件 满足,则把数据填充在该div上.

<div style="width: 245px;float: left">
{% for item in queryset_dict %}
{% if filter模版语言返回结果 %}
<div style="width: 245px;" >
<img src="/{{ item.student__pic }}" alt="" style="width: 245px;height: 250px">
<p>{{ item.student__name }}</p>
<p>{{ item.letter_of_thanks }}</p>
</div>
{% endif %}
{% endfor %}
</div>

2.filter 用法:

默认只允许 传入2个参数,如果传入参数过多,就传入字符串,然后分割!

@register.filter
def image_show2(value,arg): countet = value # 当前for循环次数
allcount = int(arg.split(',')[0]) # 前端页面列数
remainder = int(arg.split(',')[1]) # 余数
if countet%allcount == remainder:
return True
else:
return False

3.filter使用方法:

{{ 参数1 | filter :参数2  }}

4.前端页面:

<div style="width: 245px;float: left">
{% for item in queryset_dict %}
{% if forloop.counter|image_show2:"4,0" %}
<div style="width: 245px;" >
<img src="/{{ item.student__pic }}" alt="" style="width: 245px;height: 250px">
<p>{{ item.student__name }}</p>
<p>{{ item.letter_of_thanks }}</p>
</div>
{% endif %}
{% endfor %}
</div>

注意: img标签的 src 地址斜杠 /

实现方式三: JQ中Ajax实现

设计思路:

1.访问页面,

2.自动发送ajax请求

3.ajax获取数据

4.求余判断,生成标签.页面添加标签

实现方法:

1.后台判断,Ajax发送的POST请求, => 数据库查询获取数据,

def student1(request):

    if request.method == 'POST':
queryset_dict = models.StudentDetail.objects.filter(student__status=1).values('letter_of_thanks',
'student__name', 'student__pic',
'student__company',
'student__salary')
queryset_list = list(queryset_dict) return HttpResponse(json.dumps(queryset_list))
else:
return render(request,'student.html')

注意: 后台获取的数据形式为 QuerySet[{数据1},{数据2}] , 需要先转换成列表形式 再json.dumps()

2.json返回前端.

3.前端JQ创建标签,填充数据,把标签添加到div1,div2,...上

$.each(data,function (k,v) {
k = k + 1; var div = document.createElement('div');
div.className ='item';
var img = document.createElement('img');
img.src='/'+v.student__pic;
var p1 = document.createElement('p');
p1.innerText = v.letter_of_thanks;
div.appendChild(img);
div.appendChild(p1); if(k%4 == 1){
$('#container').children(':eq(0)').append(div);
}else if(k%4 == 2){
$('#container').children(':eq(1)').append(div);
}else if(k%4 == 3){
$('#container').children(':eq(2)').append(div);
}else if(k%4 == 0){
$('#container').children(':eq(3)').append(div);
}else {
console.log('error')
}
})

完整代码:

from django.shortcuts import render,HttpResponse
import json # Create your views here.
from app01 import models def student1(request): if request.method == 'POST':
queryset_dict = models.StudentDetail.objects.filter(student__status=1).values('letter_of_thanks',
'student__name', 'student__pic',
'student__company',
'student__salary')
queryset_list = list(queryset_dict) return HttpResponse(json.dumps(queryset_list))
else:
return render(request,'student.html')

后台代码

{% load newtag %}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style>
.clearfix:after{
content: 'x';
height: 0;
visibility: hidden;
clear: both;
display: block;
}
.stu{
margin:0 auto;
width: 980px;
}
.item{
width:245px;
}
.item img{
width: 245px;
height: 250px;
}
</style>
</head>
<body> <div class="clearfix stu" id="container">
<div style="width: 245px;float: left"> </div>
<div style="width: 245px;float: left"> </div>
<div style="width: 245px;float: left"> </div>
<div style="width: 245px;float: left"> </div>
</div> <script src="/static/js/jquery-2.1.4.min.js"></script>
<script>
$(function () {
$.ajax({
url:'/student1/',
type:'POST',
dataType:'json',
success:function (data) {
console.log('ok');
console.log(data);
$.each(data,function (k,v) {
k = k + 1; var div = document.createElement('div');
div.className ='item';
var img = document.createElement('img');
img.src='/'+v.student__pic;
var p1 = document.createElement('p');
var p2 = document.createElement('p');
p1.innerText = v.student__name;
p2.innerText = v.letter_of_thanks;
div.appendChild(img);
div.appendChild(p1);
div.appendChild(p2);
console.log(div);
if(k%4 == 1){
$('#container').children(':eq(0)').append(div);
}else if(k%4 == 2){
$('#container').children(':eq(1)').append(div);
}else if(k%4 == 3){
$('#container').children(':eq(2)').append(div);
}else if(k%4 == 0){
$('#container').children(':eq(3)').append(div);
}else {
console.log('error')
}
})
}
})
}) </script>
</body>
</html>

前端页面

【Python之路】特别篇--Django瀑布流实现的更多相关文章

  1. 【Python之路】特别篇--Django生产环境部署

    Django的部署可以有很多方式,采用nginx+uwsgi的方式是其中比较常见的一种方式. uWSGI uWSGI是一个Web服务器,它实现了WSGI协议.uwsgi.http等协议.Nginx中H ...

  2. python之路基础篇

    基础篇 1.Python基础之初识python 2.Python数据类型之字符串 3.Python数据类型之列表 4.Python数据类型之元祖 5.Python数据类型之字典 6.Python Se ...

  3. python之路入门篇

    一. Python介绍 python的创始人为吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,Guido开始写能够解释Python语言语法的解释器.Python这个名字,来 ...

  4. python之路——基础篇(2)模块

    模块:os.sys.time.logging.json/pickle.hashlib.random.re 模块分为三种: 自定义模块 第三方模块 内置模块 自定义模块 1.定义模块 将一系列功能函数或 ...

  5. python之路第一篇

    一.python环境的搭建 1.window下环境的搭建 (1).在 https://www.python.org/downloads/ 下载自己系统所需要的python版本 (2).安装python ...

  6. python之路第二篇(基础篇)

    入门知识: 一.关于作用域: 对于变量的作用域,执行声明并在内存中存在,该变量就可以在下面的代码中使用. if 10 == 10: name = 'allen' print name 以下结论对吗? ...

  7. Python之路(第九篇)Python文件操作

    一.文件的操作 文件句柄 = open('文件路径+文件名', '模式') 例子 f = open("test.txt","r",encoding = “utf ...

  8. Python之路(第二篇):Python基本数据类型字符串(一)

    一.基础 1.编码 UTF-8:中文占3个字节 GBK:中文占2个字节 Unicode.UTF-8.GBK三者关系 ascii码是只能表示英文字符,用8个字节表示英文,unicode是统一码,世界通用 ...

  9. Python之路(第一篇):Python简介和基础

    一.开发简介 1.开发:      开发语言:               高级语言:python.JAVA.PHP.C#..ruby.Go-->字节码                低级语言: ...

随机推荐

  1. centos7 yum安装nginx和 编译安装tengine

    说明 我这里给大家演示一下如何安装nginx,nginx我就不多介绍了,然后我再说一点就是,安装的两种方法都可以,编译安装和yum安装,我不能每个都演示两遍呀,所以看到我这博客的你,学会举一反三好吧? ...

  2. django类视图的使用

    1 类视图引入 以函数的方式定义的视图称为函数视图,函数视图便于理解. 但是遇到一个视图对应的路径提供了多种不同HTTP请求方式的支持时,便需要在一个函数中编写不同的业务逻辑,代码可读性与复用性都不佳 ...

  3. 【hash】Seek the Name, Seek the Fame

    [哈希和哈希表]Seek the Name, Seek the Fame 题目描述 The little cat is so famous, that many couples tramp over ...

  4. 怎样理解第三方Cookie

    1. Cookie往往是用来存储用户信息的, 但有些恶意站点设法伪造了带有正确Cookie的HTTP请求, 这时就会产生安全问题( CSRF 攻击 ). 这里恶意网站获取cookie的行为就是第三方c ...

  5. hdu 2189还是dp..

    题目的意思比较简单,类似计数dp. 一开始我想让dp[i]+=dp[i-prime] 每次遍历比i小的所有素数,然后发现有重叠的 比如 2+3 3+2 就导致错误.看了其他人的填充方式,发现定下pri ...

  6. SQL游标示例

    DECLARE @@totalNum INT;SET @@totalNum=0;DECLARE @num INT;DECLARE @CustomInfo NVARCHAR(MAX);DECLARE M ...

  7. 使用高德地图JS获取当前位置和经纬度

    先看效果,我做的是这样的,可以按地图位置来返回当前你点的位置(图一,二),也可以根据输入框的自动搜索(图三,四) HTML的代码: <div> <input type="t ...

  8. 7.Spring整合Hibernate_1

    Spring 整合 Hibernate 1.Spring指定 database,给下面创建的 SessionFactory用 <!-- !!!!!可以使用 @Resource 将 这个bean对 ...

  9. 【python】多进程、多线程、序列

    一.多进程 1.子进程永远返回0,而父进程返回子进程的ID.这样做的理由是,一个父进程可以fork出很多子进程,所以,父进程要记下每个子进程的ID,而子进程只需要调用getppid()就可以拿到父进程 ...

  10. 程序员和IT员不能错过的网站

    前言本文收录一些值得收藏的开发相关网站. 目录一.搜索引擎二.在线课程三.在线练习四.在线工具箱五.在线编译器六.技术论坛或社区七.音乐放松一下 一.搜索引擎搜索引擎大家最熟悉不过,本没有必要列出,但 ...