Django 组合索引
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [os.path.join(BASE_DIR, 'templates')],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
'libraries': { # Adding this section should work around the issue.
'staticfiles': 'django.templatetags.static',
},
},
},
]
settings
urls.py
from django.contrib import admin
from django.urls import path, re_path
from cmdb import views
from django.conf.urls import url, include
from app04 import views urlpatterns = [
path(r'article/', views.article),
re_path(r'article-(?P<article_type_id>\d+)-(?P<category_id>\d+)', views.article),
]
from django.shortcuts import render
from app04 import models
# Create your views here. def article(request, **kwargs):
article_type_list = models.ArticleType.objects.all()
category_list = models.Category.objects.all()
condition = {}
if not kwargs: # 第一次访问时,字典中的值不存在,设置初值
kwargs['article_type_id'] = 0
kwargs['category_id'] = 0
for k, v in kwargs.items(): # 把值为0的k,v过滤排除掉,字典如:{'category_id': '2', 'article_type_id': '1'}
kwargs[k] = int(v) # 把字典中的字符串转换位数字,传给前台
if v == '':
pass
else:
condition[k] = v
print(condition)
result = models.Article.objects.filter(**condition)
print(result)
return render(request,
'article.html',
{
'result': result,
'article_type_list': article_type_list,
'category_list': category_list,
'arg_dict': kwargs,
}
)
view
from django import template
from django.utils.safestring import mark_safe
register = template.Library() @register.simple_tag
def filter_all(arg_dict, k):
'''
逻辑:对两种类型的索引显示"全部"时添加高亮
{% if arg_dict.article_type_id == 0 %}
<a class="active" href="/article-0-{{ arg_dict.category_id }}">全部</a>
{% else %}
<a href="/article-0-{{ arg_dict.category_id }}">全部</a>
{% endif %}
:param arg_dict: 视图函数中的kwarg字典,如:{'category_id': '2', 'article_type_id': '1'}
:param k: 前端组合索引的两种分类:1.article_type_id 2.category_id
:return: 返回a标签
'''
ret = ''
if k == 'article_type_id':
if arg_dict['article_type_id'] == 0:
ret = '<a class="active" href="/article-0-%s">全部</a>' % arg_dict['category_id']
else:
ret = '<a href="/article-0-%s">全部</a>' % arg_dict['category_id']
elif k == 'category_id':
if arg_dict['category_id'] == 0:
ret = '<a class="active" href="/article-%s-0">全部</a>' % arg_dict['article_type_id']
else:
ret = '<a href="/article-%s-0">全部</a>' % arg_dict['article_type_id']
return mark_safe(ret) @register.simple_tag
def filter_article_type(arg_dict, g, h):
"""
{% for row in article_type_list %}
{% if row.id == arg_dict.article_type_id %}
<a class="active" href="/article-{{ row.id }}-{{ arg_dict.category_id }}">{{ row.caption }}</a>
{% else %}
<a href="/article-{{ row.id }}-{{ arg_dict.category_id }}">{{ row.caption }}</a>
{% endif %}
{% endfor %}
:param arg_dict:
:param g: article_type_list、category_list这两个列表,用于循环生成标签
:return:很多a标签
"""
a = []
for row in g:
if h == 'article_type_list':
if row.id == arg_dict['article_type_id']:
s = '<a class="active" href="/article-%s-%s">%s</a>' % (row.id, arg_dict['category_id'], row.caption)
else:
s = '<a href="/article-%s-%s">%s</a>' % (row.id, arg_dict['category_id'], row.caption)
a.append(s)
elif h == 'category_list':
if row.id == arg_dict['category_id']:
s = '<a class="active" href="/article-%s-%s">%s</a>' % (row.id, arg_dict['article_type_id'], row.caption)
else:
s = '<a href="/article-%s-%s">%s</a>' % (arg_dict['article_type_id'], row.id, row.caption)
a.append(s)
ret = ''.join(a)
return mark_safe(ret)
filter
{% load filter %}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style>
.condition a{
display: inline-block;
padding: 3px 5px;
border:1px solid #dddddd;
margin: 5px 5px;
}
.condition a.active{
background-color: dodgerblue;
}
</style>
</head>
<body>
<h1>过滤条件</h1>
<div class="condition">
<div>
{% filter_all arg_dict 'article_type_id'%}
{# {% if arg_dict.article_type_id == 0 %}#}
{# <a class="active" href="/article-0-{{ arg_dict.category_id }}">全部</a>#}
{# {% else %}#}
{# <a href="/article-0-{{ arg_dict.category_id }}">全部</a>#}
{# {% endif %}#}
{% filter_article_type arg_dict article_type_list 'article_type_list' %}
{# {% for row in article_type_list %}#}
{# {% if row.id == arg_dict.article_type_id %}#}
{# <a class="active" href="/article-{{ row.id }}-{{ arg_dict.category_id }}">{{ row.caption }}</a>#}
{# {% else %}#}
{# <a href="/article-{{ row.id }}-{{ arg_dict.category_id }}">{{ row.caption }}</a>#}
{# {% endif %}#}
{# {% endfor %}#}
</div>
<div>
{% filter_all arg_dict 'category_id'%}
{# {% if arg_dict.category_id == 0 %}#}
{# <a class="active" href="/article-{{ arg_dict.article_type_id }}-0">全部</a>#}
{# {% else %}#}
{# <a href="/article-{{ arg_dict.article_type_id }}-0">全部</a>#}
{# {% endif %}#}
{% filter_article_type arg_dict category_list 'category_list' %}
{# {% for row in category_list %}#}
{# {% if row.id == arg_dict.category_id %}#}
{# <a class="active" href="/article-{{ arg_dict.article_type_id }}-{{ row.id }}">{{ row.caption }}</a>#}
{# {% else %}#}
{# <a href="/article-{{ arg_dict.article_type_id }}-{{ row.id }}">{{ row.caption }}</a>#}
{# {% endif %}#}
{# {% endfor %}#}
</div>
</div> <h1>查询结果</h1>
<ul>
{% for row in result %}
<li>{{ row.id }}-{{ row.title }}</li>
{% endfor %}
</ul>
</body>
</html>
html
from django.db import models # Create your models here. class Category(models.Model):
caption = models.CharField(max_length=16) class ArticleType(models.Model):
caption = models.CharField(max_length=16) class Article(models.Model):
title = models.CharField(max_length=32)
content = models.CharField(max_length=55) category = models.ForeignKey(Category, on_delete=models.CASCADE)
article_type = models.ForeignKey(ArticleType, on_delete=models.CASCADE)
# 直接写到内存,不写到表中
# type_choice = (
# (0, 'python'),
# (0, 'openstack'),
# (0, 'linux'),
# )
# article_type_id = models.IntegerField(choices=type_choice)
models
上面是通过去数据库取数据实现,下面方法通过从内存中(利用类的静态字段)取数据实现:
from django import template
from django.utils.safestring import mark_safe
register = template.Library() @register.simple_tag
def filter_all(arg_dict, k):
'''
逻辑:对两种类型的索引显示"全部"时添加高亮
{% if arg_dict.article_type_id == 0 %}
<a class="active" href="/article-0-{{ arg_dict.category_id }}">全部</a>
{% else %}
<a href="/article-0-{{ arg_dict.category_id }}">全部</a>
{% endif %}
:param arg_dict: 视图函数中的kwarg字典,如:{'category_id': '2', 'article_type_id': '1'}
:param k: 前端组合索引的两种分类:1.article_type_id 2.category_id
:return: 返回a标签
'''
ret = ''
if k == 'article_type_id':
if arg_dict['article_type_id'] == 0:
ret = '<a class="active" href="/article-0-%s">全部</a>' % arg_dict['category_id']
else:
ret = '<a href="/article-0-%s">全部</a>' % arg_dict['category_id']
elif k == 'category_id':
if arg_dict['category_id'] == 0:
ret = '<a class="active" href="/article-%s-0">全部</a>' % arg_dict['article_type_id']
else:
ret = '<a href="/article-%s-0">全部</a>' % arg_dict['article_type_id']
return mark_safe(ret) @register.simple_tag
def filter_article_type(arg_dict, g, h):
"""
逻辑:
{% for row in article_type_list %}
{% if row.id == arg_dict.article_type_id %}
<a class="active" href="/article-{{ row.id }}-{{ arg_dict.category_id }}">{{ row.caption }}</a>
{% else %}
<a href="/article-{{ row.id }}-{{ arg_dict.category_id }}">{{ row.caption }}</a>
{% endif %}
{% endfor %}
:param arg_dict:
:param g: article_type_list、category_list这两个列表,用于循环生成标签
:param h: article_type_list、category_list这两个列表的字符串形式传参,流程控制
:return:很多a标签
"""
a = []
for row in g:
if h == 'article_type_list':
if row[0] == arg_dict['article_type_id']:
s = '<a class="active" href="/article-%s-%s">%s</a>' % (row[0], arg_dict['category_id'], row[1])
else:
s = '<a href="/article-%s-%s">%s</a>' % (row[0], arg_dict['category_id'], row[1])
a.append(s)
elif h == 'category_list':
if row.id == arg_dict['category_id']:
s = '<a class="active" href="/article-%s-%s">%s</a>' % (row.id, arg_dict['article_type_id'], row.caption)
else:
s = '<a href="/article-%s-%s">%s</a>' % (arg_dict['article_type_id'], row.id, row.caption)
a.append(s)
ret = ''.join(a)
return mark_safe(ret)
filter
from django.db import models # Create your models here. class Category(models.Model):
caption = models.CharField(max_length=16) # class ArticleType(models.Model):
# caption = models.CharField(max_length=16) class Article(models.Model):
title = models.CharField(max_length=32)
content = models.CharField(max_length=55) category = models.ForeignKey(Category, on_delete=models.CASCADE)
# article_type = models.ForeignKey(ArticleType, on_delete=models.CASCADE)
# 通过静态字段实现,直接写到内存,不写到表中
type_choice = (
(1, 'python'),
(2, 'openstack'),
(3, 'linux'),
)
article_type_id = models.IntegerField(choices=type_choice)
models
from django.shortcuts import render
from app04 import models
# Create your views here. def article(request, **kwargs):
# article_type_list = models.ArticleType.objects.all()
article_type_list = models.Article.type_choice # 通过静态字段形式访问
category_list = models.Category.objects.all()
condition = {}
if not kwargs: # 第一次访问时,字典中的值不存在,设置初 值
kwargs['article_type_id'] = 0
kwargs['category_id'] = 0
for k, v in kwargs.items(): # 把值为0的k,v过滤排除掉,字典如:{'category_id': '2', 'article_type_id': '1'}
kwargs[k] = int(v) # 把字典中的字符串转换位数字,传给前台
if v == '':
pass
else:
condition[k] = v result = models.Article.objects.filter(**condition)
return render(request,
'article.html',
{
'result': result,
'article_type_list': article_type_list,
'category_list': category_list,
'arg_dict': kwargs,
}
)
view
Django 组合索引的更多相关文章
- Oracle组合索引与回表
回表 简单来说就是数据库根据索引找到了指定的记录所在行后,还需要根据rowid再次到数据块里取数据的操作. "回表"一般就是指执行计划里显示的"TABLE ACCESS ...
- [慢查优化]建索引时注意字段选择性 & 范围查询注意组合索引的字段顺序
文章转自:http://www.cnblogs.com/zhengyun_ustc/p/slowquery2.html 写在前面的话: 之前曾说过"不要求每个人一定理解 联表查询(join/ ...
- MongoDB性能篇之创建索引,组合索引,唯一索引,删除索引和explain执行计划
这篇文章主要介绍了MongoDB性能篇之创建索引,组合索引,唯一索引,删除索引和explain执行计划的相关资料,需要的朋友可以参考下 一.索引 MongoDB 提供了多样性的索引支持,索引信息被保存 ...
- mysql组合索引顺序参考
问题背景 : 当我们需要创建一个组合索引, 索引的顺序对于效率影响很大, 怎么确定索引的顺序; 解决方法 : 我们应该依据字段的全局基数和选择性, 而不是字段的某个具体的值来确定; 表结构 : dc ...
- mysql组合索引与字段顺序
很多时候,我们在mysql中创建了索引,但是某些查询还是很慢,根本就没有使用到索引!一般来说,可能是某些字段没有创建索引,或者是组合索引中字段的顺序与查询语句中字段的顺序不符. 看下面的例子:假设有一 ...
- Mysql索引介绍及常见索引(主键索引、唯一索引、普通索引、全文索引、组合索引)的区别
Mysql索引概念:说说Mysql索引,看到一个很少比如:索引就好比一本书的目录,它会让你更快的找到内容,显然目录(索引)并不是越多越好,假如这本书1000页,有500也是目录,它当然效率低,目录是要 ...
- MySQL单列索引和组合索引的区别介绍
MySQL单列索引和组合索引的区别介绍 作者:佚名出处:IT专家网2010-11-22 13:05 MySQL单列索引是我们使用MySQL数据库中经常会见到的,MySQL单列索引和组合索引的区别可能有 ...
- 组合索引leaf 数据存储
1 Z 2 X 3 U 4 T 5 G 6 F 7 C 8 B 9 A 1 A 2 B 3 C 4 D Oracle的索引是以平衡树的方式组织存储的:保存的是索引列的值,以及该行的rowid的一部分( ...
- oracle 优化——索引与组合索引
1.索引结构.第一张图是索引的官方图解,右侧是存储方式的图解. 图中很清晰的展示了索引存储的状况. 在leaf 节点中存储了一列,索引所对应项的 :值,rowId,长度,头信息(控制信息) 这样我们就 ...
随机推荐
- 回调函数(callback)是什么?
你到一个商店买东西,刚好你要的东西没有货,于是你在店员那里留下了你的电话,过了几天店里有货了,店员就打了你的电话,然后你接到电话后就到店里去取了货.在这个例子里,你的电话号码就叫回调函数,你把电话留给 ...
- UILabel标签文字过长时的显示方式
lineBreakMode:设置标签文字过长时的显示方式. label.lineBreakMode = NSLineBreakByCharWrapping; //以字符为显示单位显示,后面部分省略不显 ...
- OpenCV学习笔记:opencv_core模块
一,简介: opencv最基础的库.包含exception,point,rect,size,slice,vector,matrix,image等数据结构,和相应的操作函数,以及一些基础算法. 二,分析 ...
- vfptr(2)
//i_vptr struct i_vptr { ; }; //vptr.h #include "i_vptr.h" #include <iostream> class ...
- (转载)java提高篇(五)-----抽象类与接口
接口和内部类为我们提供了一种将接口与实现分离的更加结构化的方法. 本文是转载的(尊重原著),原文地址:http://www.cnblogs.com/chenssy/p/3376708.html 抽象类 ...
- 1070 Bash游戏 V4
1070 Bash游戏 V4 基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题 有一堆石子共有N个.A B两个人轮流拿,A先拿.每次拿的数量最少1个,最多不超过对手上 ...
- CSS3 Flex布局(项目)
一.order属性 order属性定义项目的排列顺序.数值越小,排列越靠前,默认为0. 二.flex-grow属性 flex-grow属性定义项目的放大比例,默认为0,即如果存在剩余空间,也不放大. ...
- SOE 部署错误 ClassFactory cannot supply requested class
问题描述: 部署完SOE,对某个服务启用部署的SOE时,出现错误信息,假如对地图服务SampleWorldCities启用刚部署的SOE,错误信息如下: service failed to start ...
- Python如何实现单例模式?其他23种设计模式python如何实现?
#使用__metaclass__(元类)的高级python用法 class Singleton2(type): def __init__(cls, name, bases, dict): super( ...
- rpm命令相关命令运用实例
1) 挂载光盘文件到/media目录 2) 进去/media目录下的Packages目录 3) 查看系统已安装的所有rpm包 4) 查看系统是否安装dhcp软件包 5,安装dhcp软件包 6) 查看d ...