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 组合索引的更多相关文章

  1. Oracle组合索引与回表

    回表 简单来说就是数据库根据索引找到了指定的记录所在行后,还需要根据rowid再次到数据块里取数据的操作. "回表"一般就是指执行计划里显示的"TABLE ACCESS ...

  2. [慢查优化]建索引时注意字段选择性 & 范围查询注意组合索引的字段顺序

    文章转自:http://www.cnblogs.com/zhengyun_ustc/p/slowquery2.html 写在前面的话: 之前曾说过"不要求每个人一定理解 联表查询(join/ ...

  3. MongoDB性能篇之创建索引,组合索引,唯一索引,删除索引和explain执行计划

    这篇文章主要介绍了MongoDB性能篇之创建索引,组合索引,唯一索引,删除索引和explain执行计划的相关资料,需要的朋友可以参考下 一.索引 MongoDB 提供了多样性的索引支持,索引信息被保存 ...

  4. mysql组合索引顺序参考

    问题背景 : 当我们需要创建一个组合索引, 索引的顺序对于效率影响很大, 怎么确定索引的顺序; 解决方法 : 我们应该依据字段的全局基数和选择性, 而不是字段的某个具体的值来确定; 表结构 :  dc ...

  5. mysql组合索引与字段顺序

    很多时候,我们在mysql中创建了索引,但是某些查询还是很慢,根本就没有使用到索引!一般来说,可能是某些字段没有创建索引,或者是组合索引中字段的顺序与查询语句中字段的顺序不符. 看下面的例子:假设有一 ...

  6. Mysql索引介绍及常见索引(主键索引、唯一索引、普通索引、全文索引、组合索引)的区别

    Mysql索引概念:说说Mysql索引,看到一个很少比如:索引就好比一本书的目录,它会让你更快的找到内容,显然目录(索引)并不是越多越好,假如这本书1000页,有500也是目录,它当然效率低,目录是要 ...

  7. MySQL单列索引和组合索引的区别介绍

    MySQL单列索引和组合索引的区别介绍 作者:佚名出处:IT专家网2010-11-22 13:05 MySQL单列索引是我们使用MySQL数据库中经常会见到的,MySQL单列索引和组合索引的区别可能有 ...

  8. 组合索引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的一部分( ...

  9. oracle 优化——索引与组合索引

    1.索引结构.第一张图是索引的官方图解,右侧是存储方式的图解. 图中很清晰的展示了索引存储的状况. 在leaf 节点中存储了一列,索引所对应项的 :值,rowId,长度,头信息(控制信息) 这样我们就 ...

随机推荐

  1. Webkit内核探究【2】——css简介

    注:[转载请注明文章来源.保持原样] 出处:http://www.cnblogs.com/jyli/archive/2010/01/31/1660364.html 作者:李嘉昱 CSS在Webkit中 ...

  2. 读取文件之<绝对路径>与<相对路径>

    前言:字符流.字节流读取文件,下面的代码是在网上找到的一个各种文件读取方式,还算比较详细,分享给大家. public class ReadFromFile { /** * 以字节为单位读取文件,常用于 ...

  3. Python如何利用多核处理器

    Python中,如果想使程序充分利用多核处理器,有以下几个方案: l 使用threading模块,然后将程序运行在IronPython或Jython之上. l 使用Python自带的multiproc ...

  4. okhttp 通过网关请求服务端返回数据

    1.启动类代码 package com.tycoon.service; import org.springframework.boot.SpringApplication; import org.sp ...

  5. WINDOWS 7.1 SDK 安装失败

    错误提示: Please refer to Samples\Setup\HTML\ConfigDetails.htm document for further information. 原因:本机上安 ...

  6. Unity3d 子线程能做的事

    一,子线程中能做的事: 1,数据逻辑方面计算: 二,子线程中,不能: 1,加载场景相关事件: Application.LoadLevelAsync.Application.LoadLevel等: 2, ...

  7. 构造三层时报错“程序 “D:\MyTest\....”不包含适合于入口点的静态"Main"方法”

    错误 1 程序“D:\MyTest\EBookShop\Model\obj\x86\Debug\Model.exe”不包含适合于入口点的静态“Main”方法 原因:原来创建项目的时候,用的是“空项目” ...

  8. 【BZOJ2325】[ZJOI2011]道馆之战 线段树+树链剖分

    [BZOJ2325][ZJOI2011]道馆之战 Description 口袋妖怪(又名神奇宝贝或宠物小精灵)红/蓝/绿宝石中的水系道馆需要经过三个冰地才能到达馆主的面前,冰地中的每一个冰块都只能经过 ...

  9. 不恰当使用线程池处理 MQ 消息引起的故障

    现状 业务部门反应网站访问特别慢,负责运维监控的同事说MQ消息队列积压了,中间件的说应用服务器内存占用很高,GC 一直回收不了内存,GC 线程占了近 100% 的 CPU,其他的基本上都在等待,数据库 ...

  10. Windows下批处理文件(.bat)的使用

    cmd文件和bat文件的区别:在本质上两者没有区别,都是简单的文本编码方式,都可以用记事本创建.编辑和查看.两者所用的命令行代码也是共用的,只是cmd文件中允许使用的命令要比bat文件多.cmd文件只 ...