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,长度,头信息(控制信息) 这样我们就 ...
随机推荐
- 【OC学习-13】什么是组合,它和继承是什么关系?
继承有两缺点:(1)当层级越来越多时,假如每一个层级都有实例变量,那么最下层的子类继承的实例变量会超级多,沉重.(2)当消息传递自子类往上时.层级越多,效率越低下. 所以就有了组合.说实话区分继承和组 ...
- android中TabHost和RadioGroup
android底部菜单应用 博客分类: android--UI示例 TabHostMenuRadioGroupButton 在android中实现菜单功能有多种方法. Options Menu:用户 ...
- poj 2125(最小割)
题目链接:http://poj.org/problem?id=2125 思路:将最小点权覆盖转化为最小割模型,于是拆点建图,将点i拆成i,i+n,其中vs与i相连,边容量为w[i]-,i+n与vt相连 ...
- jprofiler_监控远程linux服务器的JVM进程(转 非常棒)
几天前写了一篇文章,jprofiler_监控远程linux服务器的tomcat进程(实践),介绍了使用jprofiler怎样监控远程linux的tomcat进程,这两天想了想,除了可以监控tomcat ...
- 使用jenkins进行Android的持续集成
关于持续集成的定义和意义可以参考它的 百度百科 主要意义有以下几点: 减少风险 减少重复过程 任何时间.任何地点生成可部署的软件 增强项目的可见性 建立团队对开发产品的信心 持续集成的实施 持续集成的 ...
- hdu 1853 (费用流 拆点)
// 给定一个有向图,必须用若干个环来覆盖整个图,要求这些覆盖的环的权值最小. 思路:原图每个点 u 拆为 u 和 u' ,从源点引容量为 1 费用为 0 的边到 u ,从 u' 引相同性质的边到汇点 ...
- JavaScript严格模式为何要禁用With语句
看了很多遍JavaScript严格模式,其中有说“禁用With语句”,以前看到这都是骑马观花,一带而过,因为平时就很少用到这个语句,禁不禁用对自己关系都不是很大.今天禁不住想知道为何“严格模式”就容不 ...
- Uva10972(RevolC FaeLoN)
题目链接:传送门 题目大意:给你一副无向图,问至少加多少条边使图成为边双联通图 题目思路:tarjan算法+缩点(如果已经是双连通图就直接输出0) #include <iostream> ...
- 3673: 可持久化并查集 by zky
3673: 可持久化并查集 by zky Time Limit: 5 Sec Memory Limit: 128 MBSubmit: 2170 Solved: 978[Submit][Status ...
- 关东升的《从零开始学Swift》即将出版
大家好: 苹果2015WWDC大会发布了Swift2.0,它较之前的版本Swift1.x有很大的变化,所以我即将出版<从零开始学Swift> <从零开始学Swift>将在< ...