zoukankan      html  css  js  c++  java
  • Django模版语言自定义标签-实现前端 关联组合过滤查询

    前端关联 组合过滤查询

    实现效果如图:

    models.py 创建表代码

    from django.db import models
    
    # Create your models here.
    
    class Level(models.Model):
        name = models.CharField(max_length=32)
    
        def __str__(self):
            return self.name
    
    # 方向
    class Direction(models.Model):
        name = models.CharField(max_length=32)
        d_2_c = models.ManyToManyField('Category')
    
        def __str__(self):
            return self.name
    
    # 类型
    class Category(models.Model):
        name = models.CharField(max_length=32)
        def __str__(self):
            return self.name
    
    # #反向
    # models.Category.objects.filter(Direction__id =id)
    # # 正向
    # models.Direction.objects.filter(id = id).d_2_c.all()
    
    class Video(models.Model):
        lv = models.ForeignKey(Level)
        cg = models.ForeignKey(Category)
    
        title = models.CharField(verbose_name='标题', max_length=32)
        summary = models.CharField(verbose_name='简介', max_length=32)
        img = models.ImageField(verbose_name='图片', upload_to='./static/images/Video/')
        href = models.CharField(verbose_name='视频地址', max_length=256)
    
        create_date = models.DateTimeField(auto_now_add=True)
        def __str__(self):
            return self.title

    urls.py路由分发代码

    from django.conf.urls import url
    from django.contrib import admin
    from app01 import views
    
    urlpatterns = [
        url(r'^admin/', admin.site.urls),
        url(r'^video-(?P<dr_id>d+)-(?P<cg_id>d+)-(?P<lv_id>d+).html',views.video,name='vvv2'),
    ]

    views.py视图函数代码

    from django.shortcuts import render
    from app01 import models
    
    # Create your views here.
    def video(request,*args,**kwargs):
        # 0-0-0.html
        # 0-1-0.html
        # 1-0-0.html
        # 1-1-0.html [1,2,3,4]
        # 2-1-0.html [2,3,4]
        dr_id = kwargs.get('dr_id')
        cg_id = kwargs.get('cg_id')
        lv_id = kwargs.get('lv_id')
        condition = {}
    
        drection_list = models.Direction.objects.all()
        level_list = models.Level.objects.all()
    
        if dr_id == "0":
            # 未选择方向
            category_list = models.Category.objects.all()
            if cg_id == '0':
                # 未选择分类
                pass
            else:
                # 选择分类
                # models.Video.objects.filter(cg_id=cg_id)
                condition['cg_id'] = cg_id
        else:
            # 选择了方向
            category_list = models.Category.objects.filter(direction=dr_id)
    
            temp = category_list.values_list('id')
            cg_id_list = list(zip(*temp))[0]
    
            if cg_id == '0':
                # 未选择分类
                condition['cg_id__in'] = cg_id_list
            else:
                # 选择了分类
                if int(cg_id) in cg_id_list:
                    condition['cg_id'] = cg_id
                else:
                    condition['cg_id__in'] = cg_id_list
                    kwargs['cg_id'] = '0'
    
        if lv_id == '0':
            pass
        else:
            condition['lv_id'] = lv_id
    
        result = models.Video.objects.filter(**condition)
        print(result)
    
        return render(request, 'video.html', {
            'drection_list': drection_list,
            'level_list': level_list,
            'category_list': category_list,
            'arg_dict': kwargs,
            'result':result,
        })

    自定义标签 templatetags xx.py代码

    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
    # @Date    : 2017/2/6
    # @Author  : Jesson 
    # @Blog    : http://www.cnblogs.com/hellojesson/
    #
    from django import template
    from django.utils.safestring import mark_safe
    register = template.Library()
    
    # 方向
    @register.simple_tag
    def dr_tag(obj,arg_dict):
        """
        生成A标签
        :param obj:
        :param arg_dict:
        :return:
        """
        from django.urls import reverse
    
        url = reverse('vvv2', kwargs={'dr_id': obj.id, 'cg_id': arg_dict.get('cg_id'), 'lv_id': arg_dict.get('lv_id')})
    
        if str(obj.id) == arg_dict.get('dr_id'):
            # 获取当前URL
            tag = "%s" %(url,obj.name)
            return mark_safe(tag)
        else:
            tag = "%s" % (url, obj.name)
            return mark_safe(tag)
    
    # 类别
    @register.simple_tag
    def cg_tag(obj,arg_dict):
        from django.urls import reverse
    
        url = reverse('vvv2', kwargs={'dr_id': arg_dict.get('dr_id'), 'cg_id': obj.id, 'lv_id': arg_dict.get('lv_id')})
    
        if str(obj.id) == arg_dict.get('cg_id'):
            # 获取当前URL
            tag = "%s" %(url,obj.name)
            return mark_safe(tag)
        else:
            tag = "%s" % (url, obj.name)
            return mark_safe(tag)
    
    # 难度级别
    @register.simple_tag
    def lv_tag(obj,arg_dict):
        from django.urls import reverse
    
        url = reverse('vvv2', kwargs={'dr_id': arg_dict.get('dr_id'), 'cg_id': arg_dict.get('cg_id'), 'lv_id': obj.id})
    
        if str(obj.id) == arg_dict.get('lv_id'):
            # 获取当前URL
            tag = "%s" %(url,obj.name)
            return mark_safe(tag)
        else:
            tag = "%s" % (url, obj.name)
            return mark_safe(tag)
    
    # 全部显示
    @register.simple_tag
    def total_tag_2(arg_dict,key):
        from django.urls import reverse
        if key == 'dr_id':
            url = reverse('vvv2', kwargs={'dr_id': 0, 'cg_id': arg_dict.get('cg_id'), 'lv_id': arg_dict.get('lv_id')})
        elif key == 'cg_id':
            url = reverse('vvv2', kwargs={'dr_id': arg_dict.get('dr_id'), 'cg_id': 0, 'lv_id': arg_dict.get('lv_id')})
    
        elif key == 'lv_id':
            url = reverse('vvv2', kwargs={'dr_id': arg_dict.get('dr_id'), 'cg_id': arg_dict.get('cg_id'), 'lv_id': 0})
        else:
            url = ''
        if arg_dict.get(key) == '0':
            tag = "全部" % (url,)
        else:
            tag = "全部" % (url,)
        return mark_safe(tag)

    前端video.html 代码

    {% load xx %}
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        <style>
            .filter {
                background-color: #EFEFEF;
                line-height: 20px;
                margin-top: 20px;
            }
            .filter a{
                display: inline-block;
                text-decoration:none;
                margin: 5px;
                padding: 3px 5px;
            }
            .filter a.active{
                background-color: brown;
                color: white;
            }
        </style>
    </head>
    <body>
        <h2>筛选条件</h2>
        <div class="filter">
            <div>
                <a>方向:</a>
                {% total_tag_2 arg_dict 'dr_id' %}
                {% for item in drection_list %}
                    <!-- if判断,如果kwargs.dr_id = item.id
                        - 加入样式
                    else:
                        - 无样式
                       -->
                    {% dr_tag item arg_dict %}
                {% endfor %}
    
            </div>
            <div>
                <a>分类:</a>
                {% total_tag_2 arg_dict 'cg_id' %}
                {% for item in category_list %}
                    {% cg_tag item arg_dict %}
                {% endfor %}
            </div>
            <div>
                <a>难度:</a>
                {% total_tag_2 arg_dict 'lv_id' %}
                {% for item in level_list %}
                    {% lv_tag item arg_dict %}
                {% endfor %}
            </div>
        </div>
    
        <h2>查询结果</h2>
        <div class="content">
            {% for row in result %}
                <div style=" 100px;height: 260px;float: left;margin: 3px;">
                    <img style=" 100px;height: 150px;" src="{{ row.img }}">
                    <p>{{ row.title }}</p>
                    <p>{{ row.summary }}</p>
                </div>
            {% endfor %}
        </div>
    </body>
    </html>
  • 相关阅读:
    (转)Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks(更快的RCNN:通过区域提议网络实现实时)
    vi常用命令
    Windows与Ubuntu通过ssh传文件
    Windows建立FTP服务器与Ubuntu互传文件
    备忘
    一些大牛博客地址
    springboot、springcloud学习记录
    我的git记录
    svn
    我的linux命令记录
  • 原文地址:https://www.cnblogs.com/hellojesson/p/6373399.html
Copyright © 2011-2022 走看看