前端关联 组合过滤查询

实现效果如图:

models.py 创建表代码

  1. from django.db import models
  2. # Create your models here.
  3. class Level(models.Model):
  4. name = models.CharField(max_length=32)
  5. def __str__(self):
  6. return self.name
  7. # 方向
  8. class Direction(models.Model):
  9. name = models.CharField(max_length=32)
  10. d_2_c = models.ManyToManyField('Category')
  11. def __str__(self):
  12. return self.name
  13. # 类型
  14. class Category(models.Model):
  15. name = models.CharField(max_length=32)
  16. def __str__(self):
  17. return self.name
  18. # #反向
  19. # models.Category.objects.filter(Direction__id =id)
  20. # # 正向
  21. # models.Direction.objects.filter(id = id).d_2_c.all()
  22. class Video(models.Model):
  23. lv = models.ForeignKey(Level)
  24. cg = models.ForeignKey(Category)
  25. title = models.CharField(verbose_name='标题', max_length=32)
  26. summary = models.CharField(verbose_name='简介', max_length=32)
  27. img = models.ImageField(verbose_name='图片', upload_to='./static/images/Video/')
  28. href = models.CharField(verbose_name='视频地址', max_length=256)
  29. create_date = models.DateTimeField(auto_now_add=True)
  30. def __str__(self):
  31. return self.title

urls.py路由分发代码

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

views.py视图函数代码

  1. from django.shortcuts import render
  2. from app01 import models
  3. # Create your views here.
  4. def video(request,*args,**kwargs):
  5. # 0-0-0.html
  6. # 0-1-0.html
  7. # 1-0-0.html
  8. # 1-1-0.html [1,2,3,4]
  9. # 2-1-0.html [2,3,4]
  10. dr_id = kwargs.get('dr_id')
  11. cg_id = kwargs.get('cg_id')
  12. lv_id = kwargs.get('lv_id')
  13. condition = {}
  14. drection_list = models.Direction.objects.all()
  15. level_list = models.Level.objects.all()
  16. if dr_id == "0":
  17. # 未选择方向
  18. category_list = models.Category.objects.all()
  19. if cg_id == '0':
  20. # 未选择分类
  21. pass
  22. else:
  23. # 选择分类
  24. # models.Video.objects.filter(cg_id=cg_id)
  25. condition['cg_id'] = cg_id
  26. else:
  27. # 选择了方向
  28. category_list = models.Category.objects.filter(direction=dr_id)
  29. temp = category_list.values_list('id')
  30. cg_id_list = list(zip(*temp))[0]
  31. if cg_id == '0':
  32. # 未选择分类
  33. condition['cg_id__in'] = cg_id_list
  34. else:
  35. # 选择了分类
  36. if int(cg_id) in cg_id_list:
  37. condition['cg_id'] = cg_id
  38. else:
  39. condition['cg_id__in'] = cg_id_list
  40. kwargs['cg_id'] = '0'
  41. if lv_id == '0':
  42. pass
  43. else:
  44. condition['lv_id'] = lv_id
  45. result = models.Video.objects.filter(**condition)
  46. print(result)
  47. return render(request, 'video.html', {
  48. 'drection_list': drection_list,
  49. 'level_list': level_list,
  50. 'category_list': category_list,
  51. 'arg_dict': kwargs,
  52. 'result':result,
  53. })

自定义标签 templatetags xx.py代码

  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3. # @Date : 2017/2/6
  4. # @Author : Jesson
  5. # @Blog : http://www.cnblogs.com/hellojesson/
  6. #
  7. from django import template
  8. from django.utils.safestring import mark_safe
  9. register = template.Library()
  10. # 方向
  11. @register.simple_tag
  12. def dr_tag(obj,arg_dict):
  13. """
  14. 生成A标签
  15. :param obj:
  16. :param arg_dict:
  17. :return:
  18. """
  19. from django.urls import reverse
  20. url = reverse('vvv2', kwargs={'dr_id': obj.id, 'cg_id': arg_dict.get('cg_id'), 'lv_id': arg_dict.get('lv_id')})
  21. if str(obj.id) == arg_dict.get('dr_id'):
  22. # 获取当前URL
  23. tag = "%s" %(url,obj.name)
  24. return mark_safe(tag)
  25. else:
  26. tag = "%s" % (url, obj.name)
  27. return mark_safe(tag)
  28. # 类别
  29. @register.simple_tag
  30. def cg_tag(obj,arg_dict):
  31. from django.urls import reverse
  32. url = reverse('vvv2', kwargs={'dr_id': arg_dict.get('dr_id'), 'cg_id': obj.id, 'lv_id': arg_dict.get('lv_id')})
  33. if str(obj.id) == arg_dict.get('cg_id'):
  34. # 获取当前URL
  35. tag = "%s" %(url,obj.name)
  36. return mark_safe(tag)
  37. else:
  38. tag = "%s" % (url, obj.name)
  39. return mark_safe(tag)
  40. # 难度级别
  41. @register.simple_tag
  42. def lv_tag(obj,arg_dict):
  43. from django.urls import reverse
  44. url = reverse('vvv2', kwargs={'dr_id': arg_dict.get('dr_id'), 'cg_id': arg_dict.get('cg_id'), 'lv_id': obj.id})
  45. if str(obj.id) == arg_dict.get('lv_id'):
  46. # 获取当前URL
  47. tag = "%s" %(url,obj.name)
  48. return mark_safe(tag)
  49. else:
  50. tag = "%s" % (url, obj.name)
  51. return mark_safe(tag)
  52. # 全部显示
  53. @register.simple_tag
  54. def total_tag_2(arg_dict,key):
  55. from django.urls import reverse
  56. if key == 'dr_id':
  57. url = reverse('vvv2', kwargs={'dr_id': 0, 'cg_id': arg_dict.get('cg_id'), 'lv_id': arg_dict.get('lv_id')})
  58. elif key == 'cg_id':
  59. url = reverse('vvv2', kwargs={'dr_id': arg_dict.get('dr_id'), 'cg_id': 0, 'lv_id': arg_dict.get('lv_id')})
  60. elif key == 'lv_id':
  61. url = reverse('vvv2', kwargs={'dr_id': arg_dict.get('dr_id'), 'cg_id': arg_dict.get('cg_id'), 'lv_id': 0})
  62. else:
  63. url = ''
  64. if arg_dict.get(key) == '0':
  65. tag = "全部" % (url,)
  66. else:
  67. tag = "全部" % (url,)
  68. return mark_safe(tag)

前端video.html 代码

  1. {% load xx %}
  2. <!DOCTYPE html>
  3. <html lang="en">
  4. <head>
  5. <meta charset="UTF-8">
  6. <title>Title</title>
  7. <style>
  8. .filter {
  9. background-color: #EFEFEF;
  10. line-height: 20px;
  11. margin-top: 20px;
  12. }
  13. .filter a{
  14. display: inline-block;
  15. text-decoration:none;
  16. margin: 5px;
  17. padding: 3px 5px;
  18. }
  19. .filter a.active{
  20. background-color: brown;
  21. color: white;
  22. }
  23. </style>
  24. </head>
  25. <body>
  26. <h2>筛选条件</h2>
  27. <div class="filter">
  28. <div>
  29. <a>方向:</a>
  30. {% total_tag_2 arg_dict 'dr_id' %}
  31. {% for item in drection_list %}
  32. <!-- if判断,如果kwargs.dr_id = item.id
  33. - 加入样式
  34. else:
  35. - 无样式
  36. -->
  37. {% dr_tag item arg_dict %}
  38. {% endfor %}
  39. </div>
  40. <div>
  41. <a>分类:</a>
  42. {% total_tag_2 arg_dict 'cg_id' %}
  43. {% for item in category_list %}
  44. {% cg_tag item arg_dict %}
  45. {% endfor %}
  46. </div>
  47. <div>
  48. <a>难度:</a>
  49. {% total_tag_2 arg_dict 'lv_id' %}
  50. {% for item in level_list %}
  51. {% lv_tag item arg_dict %}
  52. {% endfor %}
  53. </div>
  54. </div>
  55. <h2>查询结果</h2>
  56. <div class="content">
  57. {% for row in result %}
  58. <div style="width: 100px;height: 260px;float: left;margin: 3px;">
  59. <img style="width: 100px;height: 150px;" src="{{ row.img }}">
  60. <p>{{ row.title }}</p>
  61. <p>{{ row.summary }}</p>
  62. </div>
  63. {% endfor %}
  64. </div>
  65. </body>
  66. </html>

Django模版语言自定义标签-实现前端 关联组合过滤查询的更多相关文章

  1. Django模版语言的复用 1. include标签--模版导入 2.inclusion_tag自定义标签--模版导入 3.母版

    include标签--模版导入 ''' 前提:项目中,往往会出现多个页面拥有一个或几个相同的页面版块,或是一个页面多个页面版块是相同的 如何运用:可以将多个样式标签的集合进行封装,对外提供版块的名字( ...

  2. Django模版语言 格式化显示 后台datatime()时间

    Django模版语言 格式化显示 后台datatime()时间 场景描述:

  3. Django(模板语言-自定义filter和simple_tag)

    Django(模板语言-自定义filter和simple_tag)   filter过滤器的主要形式:变量|函数,意思是将变量交给函数处理,而自定义filter就是自己定义函数,因为用到已有的很少. ...

  4. Django 模版语言详解

    一.简介 模版是纯文本文件.它可以产生任何基于文本的的格式(HTML,XML,CSV等等). 模版包括在使用时会被值替换掉的 变量,和控制模版逻辑的 标签. 例: {% extends "b ...

  5. Django模板语言,标签整理

    Django模板语言 标签 内置标签引用 1. autoescape 控制自动转义是否可用. 这种标签带有任何 on 或 off 作为参数的话,他将决定转义块内效果. 该标签会以一个endautoes ...

  6. Django 模版语言

    传入变量 {{ 变量名 }} 在 view.py 的函数返回 render 时在html文件名后传入一个字典,字典的 key 对应html文件中的变量名,value 为传入的值 views.py: d ...

  7. Jinja2模版语言自定义filter的使用

    Jinja2模版语言,自带有一些filter,能够在前端的模版中控制数据按照相应的方式显示.比如以下两种filter,分别能在前端控制数字的近似精度显示和根据字符串长度补齐: round(value, ...

  8. django -- 模版语言之过滤器Filters和for循环

    前戏 在前面写的图书管理系统中,我们对模版语言应该已经不陌生了,使用{{ }}包裹起来的就是模版语言,只需要记住两种就可以了 {{ 变量名 }}            变量相关的 {% %}      ...

  9. 在django中使用自定义标签实现分页功能

    效果演示: github地址:https://github.com/mncu/django_projects/tree/master/django_projects/pagination_test 本 ...

随机推荐

  1. s5-1 CPU调度

    基本概念 通过多道程序设计得到 CPU 的最高利用率 (CPU-- I/O 脉冲周期 - - 进程的执行包括进程在 CPU 上执行和等待 I/O ) 进程的执行以 CPU 脉冲开始,其后跟着 I/O ...

  2. HDU 5212 Code (莫比乌斯反演)

    题意:给定上一个数组,求 析: 其中,f(d)表示的是gcd==d的个数,然后用莫比乌斯反演即可求得,len[i]表示能整队 i 的个数,可以线性筛选得到, 代码如下: #pragma comment ...

  3. asp.net 多线程

    //开启一条线程并执行一个方法      Thread oThread = new Thread(new ThreadStart(IIMsSqlToSqlitle2));            oTh ...

  4. GPS 编程笔记

    1.在GPS系统内,经纬度的显示方式一般都可以根据自己的爱好选择,一般有"hddd.ddddd"(度.度),"hddd*mm.mmm"(度.分. 分),&quo ...

  5. VS2013利用ajax访问不了json文件——VS2013配置webconfig识别json文件

    这两天用VS2013开发工具来访问json文件,老是报404文件,我根据网上来设置IIS添加MIME重启IIS和VS2013还是失败,无法访问json文件,但是奇怪的是可以访问txt文件 查询了很多方 ...

  6. day29(对象转xml(使用java))

    通常使用xStream工具. 将集合,数组,对象转成XML. 导入两个包: xpp3_min-1.1.4c.jar xstream-1.4.4.jar 自定义一个类 package com.baidu ...

  7. Hdu4185 Oil Skimming

    Oil Skimming Problem Description Thanks to a certain "green" resources company, there is a ...

  8. handsontable 排序问题

    排序是表格的基础功能,handsontable也会支持. 有时需求会很复杂,需要自定义排序,或者调用其他排序方法:自定义排序,比较复杂,没做过:今天要用的是调用R中的排序方法. 有两个事件before ...

  9. foreach控件的运用(非原创)http://blog.chinaunix.net/uid-26884465-id-3416869.html

    人们对从认识事物都有一个具体到抽象的过程,学习Jmeter也不例外,通过一个实例来进行学习,一方面可以让初学者有所见即所得的信心,另一方面,其实也是在初学者心中留下了对这事物的一个朦胧的印象,这在以后 ...

  10. Dnsmasq安装与配置-搭建本地DNS服务器

    默认的情况下,我们平时上网用的本地DNS服务器都是使用电信或者联通的,但是这样也导致了不少的问题,首当其冲的就是上网时经常莫名地弹出广告,或者莫名的流量被消耗掉导致网速变慢.其次是部分网站域名不能正常 ...