zoukankan      html  css  js  c++  java
  • 实现瀑布流的多种方法

    这里用到@register.filter和@register.simple_tag模板功能不够用时才会使用

     1.实现瀑布流

        1.@register.filter 只可以传2个参数,前端可以if判断

        2.@register.simple_tag  自定制模板

        3. ajax 

    1、@register.simple_tag  自定制模板

    # 自定义simple__tag   不可以做if判断
    
    ##views.py
    def student(request):
        # student
        # studentDetail
        detail_list = models.StudentDetail.objects.filter(student__status=1).values('letter_of_thanks', "student__name",
                                                                                    "student__salary", 'student__company',
                                                                                    'student__pic')
        ##获取数据库的内容
        print(detail_list)
        return render(request, 'student.html', {'detail_list': detail_list})  ##返回到前端
    
    
    
    在app1下面创建 templatetags 文件夹
    创建文件
    xx.py
    
    from django import template
    from django.utils.safestring import mark_safe
    from django.template.base import resolve_variable, Node, TemplateSyntaxError
    
    register = template.Library()
    
    @register.simple_tag
    def detail1(item,counter,allcount,remainder):
        # counter 当前循环的索引    allcount总列数    #余数
        temp = """
            <div style=" 245px;">
                <img style=" 245px;height: 200px;" src="/%s">
                <p>%s</p>
                <p>%s</p>
                <p>%s</p>
            </div>
            """
        if counter%allcount == remainder:
            #当前循环的索引 除以总列数(4列),得到余数
            temp = temp %(item['student__pic'],
                          item['student__name'],
                          item['student__salary'],
                          item['letter_of_thanks'])
            return mark_safe(temp)
            # mark_safe 传入的不是字符串,是前端代码
        else:
            return ""
    
    
    # HTMl的文件
    #
    
    {% load xx %}
    {#传入模块#}
    <!DOCTYPE html>
    <body>
    
        <div>
    
        </div>
        <style>
            .clearfix:after{
                content: '.';
                visibility: hidden;
                height: 0;
                clear: both;
                display: block;
            }
        </style>
    
        <div style="margin: 0 auto; 980px;" class="clearfix">
            <div style=" 245px;float: left">
                {% for item in detail_list %}  {# 循环前端发来的数据 #}
    
                    {% detail1 item forloop.counter 4 1 %}   {# 执行那个模块中的方法 余数等于1的话放到这 #}
    {#                   forloop.counter当前循环到多少    4列          #}
                {% endfor %}
            </div>
            <div style=" 245px;float: left">
                {% for item in detail_list %}
                    {% detail1 item forloop.counter 4 2 %}   {# 执行那个模块中的方法 余数等于3的话放到这 #}
                {% endfor %}
            </div>
            <div style=" 245px;float: left">
                {% for item in detail_list %}
                    {% detail1 item forloop.counter 4 3 %}  {# 执行那个模块中的方法 余数等于4的话放到这 #}
                {% endfor %}
            </div>
            <div style=" 245px;float: left">
                {% for item in detail_list %}
                    {% detail1 item forloop.counter 4 0 %}  {# 执行那个模块中的方法 余数等于0的话放到这 #}
                {% endfor %}
            </div>
        </div>
    

      

    2.@register.filter 只可以传2个参数,前端可以if判断

    #views.py
    def student(request):
        # student
        # studentDetail
        detail_list = models.StudentDetail.objects.filter(student__status=1).values('letter_of_thanks', "student__name",
                                                                                    "student__salary", 'student__company',
                                                                                    'student__pic')
        ##获取数据库的内容
        print(detail_list)
        return render(request, 'student.html', {'detail_list': detail_list})  ##返回到前端
    
    
    在app1下面创建 templatetags 文件夹
    创建文件
    xx.py
    
    
    @register.filter   ##只能传2个参数
    def detail3(value, arg):  ##value循环的到的当前索引  这里的arg 是总列数,和余数
        '''
        :param values:
        :param arg:
        :return:
        '''
        allcount, remainder = arg.split(',')  ##把总列数和余数进行分割
        allcount = int(allcount)    ##转换类型
        remainder = int(remainder)
        if value % allcount == remainder:   ##求余数
            return True
        return False
    
    # html.py
    {% load xx %}
    {#传入模块#}
    <!DOCTYPE html>
    <body>
    
    <div style=" 245px;float: left">
                {% for item in detail_list %}    {# 循环前端发过来的数据 #}
                    {% if forloop.counter|detail3:"4,0" %}  {# 循环到的索引 函和'总列数,余数' 放到detail3这个方法中
                      这里这可以传2个参数 ,要循环除别的列,直接改余数就可以 #}
                        <div style=" 245px;">
                        <img style=" 245px;height: 200px;" src="/{{ item.student__pic }}"> {# 图片 #}
                        <p>{{ item.student__name }}</p>    {# 姓名 #}
                        <p>{{ item.student__salary }}</p>  {# 。。。。 #}
                        <p>{{ item.letter_of_thanks }}</p>
                    </div>
                   {% endif %}
                {% endfor %}
            </div>
    

      

    ajax瀑布流方式

    # view.py

    def student1(request):
    
        if request.method == 'POST':
            detail_list = models.StudentDetail.objects.filter(student__status=1).values('letter_of_thanks', "student__name",
                                                                                        "student__salary",
                                                                                        'student__company', 'student__pic')
            detail_list = list(detail_list)  ##数据库得到的数据转换成列表类型
            return HttpResponse(json.dumps(detail_list))   ##转换成字符串
        # student
        # studentDetail
        # detail_list = models.StudentDetail.objects.filter(student__status=1).values('letter_of_thanks',"student__name","student__salary",'student__company', 'student__pic')
        return render(request,'student1.html')   ##get发送页面
    

      

    # student1.html

    {% load xx %}
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
        <div>
        </div>
        <style>
            .clearfix:after{
                content: '.';
                visibility: hidden;
                height: 0;
                clear: both;
                display: block;
            }
            .c1{
                 245px;
            }
            .c1 img{
                 245px;
                height: 200px;
            }
        </style>
    
        <div id="container" style="margin: 0 auto; 980px;" class="clearfix">
    
            <div style=" 245px;float: left">
    
            </div>
    
            <div style=" 245px;float: left">
    
            </div>
    
            <div style=" 245px;float: left">
    
    
            </div>
    
            <div style=" 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 (arg) {
                        //arg = JSON.parse(arg);
                        // arg = JSON.stringify(arg)
                        $.each(arg, function (k,v) {
                            k = k + 1;
                            var div = document.createElement('div');  //创建标签
                            div.className = 'c1';      //定义属性
                            var img = document.createElement('img'); // 创建img标签
                            rat =img.src = "/" + v.student__pic;   // 家伙是哪个属性
                            console.log(rat);  //传过来是路劲
                            var p = document.createElement('p');  //
                            cnm =p.innerText =  v.letter_of_thanks;   //
                            console.log(cnm);  //这里输出内容
                            div.appendChild(img);   //
                            div.appendChild(p);    //
                            if(k%4 == 1){
                                $('#container').children(':eq(0)').append(div);
                                //children 所有的子元素,  eq 索引
                            }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{
    
                            }
                        })
                    }
                })
            })
        </script>
    </body>
    </html>
    

      

  • 相关阅读:
    作业4.称体重
    一、虚拟环境.二、路由配置主页与404.三、2.x路由分发.四、伪静态.五、request对象.六、FBV与CBV.七、文件上传.
    一、数据库表中字段的增删改查,二、路由基础.三、有名无名分组.四、多app共存的路由分配.五、多app共存时模板冲突问题.六、创建app流程.七、路由分发.八、路由别名,九、名称空间.十、反向解析.十一、2.x新特性.十二、自定义转换器
    Django项目的创建与介绍.应用的创建与介绍.启动项目.pycharm创建启动项目.生命周期.三件套.静态文件.请求及数据.配置Mysql完成数据迁移.单表ORM记录的增删改查
    学习Django,http协议,
    值类型之间的相互转化,运算符,if条件判断,循环,函数
    js导读,js引入,js选择器,事件,操作页面文档,计算后样式,数据类型
    字体图标,盒子显隐,overflow属性,伪类设计边框,盒子阴影2d形变
    浮动布局,定位布局(固定定位,绝对定位,相对定位),过渡动画
    盒子总结,文本属性操作,reset操作,高级选择器,高级选择器优先级,边界圆角(了解),a标签的四大伪类,背景图片操作,背景图片之精灵图
  • 原文地址:https://www.cnblogs.com/pythonxiaohu/p/5831008.html
Copyright © 2011-2022 走看看