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="width: 100px;height: 260px;float: left;margin: 3px;">
<img style="width: 100px;height: 150px;" src="{{ row.img }}">
<p>{{ row.title }}</p>
<p>{{ row.summary }}</p>
</div>
{% endfor %}
</div>
</body>
</html>
Django模版语言自定义标签-实现前端 关联组合过滤查询的更多相关文章
- Django模版语言的复用 1. include标签--模版导入 2.inclusion_tag自定义标签--模版导入 3.母版
include标签--模版导入 ''' 前提:项目中,往往会出现多个页面拥有一个或几个相同的页面版块,或是一个页面多个页面版块是相同的 如何运用:可以将多个样式标签的集合进行封装,对外提供版块的名字( ...
- Django模版语言 格式化显示 后台datatime()时间
Django模版语言 格式化显示 后台datatime()时间 场景描述:
- Django(模板语言-自定义filter和simple_tag)
Django(模板语言-自定义filter和simple_tag) filter过滤器的主要形式:变量|函数,意思是将变量交给函数处理,而自定义filter就是自己定义函数,因为用到已有的很少. ...
- Django 模版语言详解
一.简介 模版是纯文本文件.它可以产生任何基于文本的的格式(HTML,XML,CSV等等). 模版包括在使用时会被值替换掉的 变量,和控制模版逻辑的 标签. 例: {% extends "b ...
- Django模板语言,标签整理
Django模板语言 标签 内置标签引用 1. autoescape 控制自动转义是否可用. 这种标签带有任何 on 或 off 作为参数的话,他将决定转义块内效果. 该标签会以一个endautoes ...
- Django 模版语言
传入变量 {{ 变量名 }} 在 view.py 的函数返回 render 时在html文件名后传入一个字典,字典的 key 对应html文件中的变量名,value 为传入的值 views.py: d ...
- Jinja2模版语言自定义filter的使用
Jinja2模版语言,自带有一些filter,能够在前端的模版中控制数据按照相应的方式显示.比如以下两种filter,分别能在前端控制数字的近似精度显示和根据字符串长度补齐: round(value, ...
- django -- 模版语言之过滤器Filters和for循环
前戏 在前面写的图书管理系统中,我们对模版语言应该已经不陌生了,使用{{ }}包裹起来的就是模版语言,只需要记住两种就可以了 {{ 变量名 }} 变量相关的 {% %} ...
- 在django中使用自定义标签实现分页功能
效果演示: github地址:https://github.com/mncu/django_projects/tree/master/django_projects/pagination_test 本 ...
随机推荐
- s5-1 CPU调度
基本概念 通过多道程序设计得到 CPU 的最高利用率 (CPU-- I/O 脉冲周期 - - 进程的执行包括进程在 CPU 上执行和等待 I/O ) 进程的执行以 CPU 脉冲开始,其后跟着 I/O ...
- HDU 5212 Code (莫比乌斯反演)
题意:给定上一个数组,求 析: 其中,f(d)表示的是gcd==d的个数,然后用莫比乌斯反演即可求得,len[i]表示能整队 i 的个数,可以线性筛选得到, 代码如下: #pragma comment ...
- asp.net 多线程
//开启一条线程并执行一个方法 Thread oThread = new Thread(new ThreadStart(IIMsSqlToSqlitle2)); oTh ...
- GPS 编程笔记
1.在GPS系统内,经纬度的显示方式一般都可以根据自己的爱好选择,一般有"hddd.ddddd"(度.度),"hddd*mm.mmm"(度.分. 分),&quo ...
- VS2013利用ajax访问不了json文件——VS2013配置webconfig识别json文件
这两天用VS2013开发工具来访问json文件,老是报404文件,我根据网上来设置IIS添加MIME重启IIS和VS2013还是失败,无法访问json文件,但是奇怪的是可以访问txt文件 查询了很多方 ...
- day29(对象转xml(使用java))
通常使用xStream工具. 将集合,数组,对象转成XML. 导入两个包: xpp3_min-1.1.4c.jar xstream-1.4.4.jar 自定义一个类 package com.baidu ...
- Hdu4185 Oil Skimming
Oil Skimming Problem Description Thanks to a certain "green" resources company, there is a ...
- handsontable 排序问题
排序是表格的基础功能,handsontable也会支持. 有时需求会很复杂,需要自定义排序,或者调用其他排序方法:自定义排序,比较复杂,没做过:今天要用的是调用R中的排序方法. 有两个事件before ...
- foreach控件的运用(非原创)http://blog.chinaunix.net/uid-26884465-id-3416869.html
人们对从认识事物都有一个具体到抽象的过程,学习Jmeter也不例外,通过一个实例来进行学习,一方面可以让初学者有所见即所得的信心,另一方面,其实也是在初学者心中留下了对这事物的一个朦胧的印象,这在以后 ...
- Dnsmasq安装与配置-搭建本地DNS服务器
默认的情况下,我们平时上网用的本地DNS服务器都是使用电信或者联通的,但是这样也导致了不少的问题,首当其冲的就是上网时经常莫名地弹出广告,或者莫名的流量被消耗掉导致网速变慢.其次是部分网站域名不能正常 ...