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>
    

      

  • 相关阅读:
    POJ 3253 Fence Repair
    POJ 2431 Expedition
    NYOJ 269 VF
    NYOJ 456 邮票分你一半
    划分数问题 DP
    HDU 1253 胜利大逃亡
    NYOJ 294 Bot Trust
    NYOJ 36 最长公共子序列
    HDU 1555 How many days?
    01背包 (大数据)
  • 原文地址:https://www.cnblogs.com/pythonxiaohu/p/5831008.html
Copyright © 2011-2022 走看看