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. python数据分析之numpy

    知乎:https://zhuanlan.zhihu.com/p/26514493 numoy安装:http://blog.csdn.net/wyc12306/article/details/53705 ...

  2. 43、android:screenOrientation

    android:screenOrientationThe orientation of the activity's display on the device. The value can be a ...

  3. 【转】linux 中fork()函数详解

    在看多线程的时候看到了这个函数,于是学习了下,下面文章写的通俗易懂,于是就开心的看完了,最后还是很愉快的算出了他最后一个问题. linux 中fork()函数详解 一.fork入门知识 一个进程,包括 ...

  4. 《从零开始学Swift》学习笔记(Day 46)——下标重写

    原创文章,欢迎转载.转载请注明:关东升的博客 下标是一种特殊属性.子类属性重写是重写属性的getter和setter访问器,对下标的重写也是重写下标的getter和setter访问器. 下面看一个示例 ...

  5. js获取滚动条的位置

    页面具有 DTD,或者说指定了 DOCTYPE 时,使用 document.documentElement. 页面不具有 DTD,或者说没有指定了 DOCTYPE,时,使用 document.body ...

  6. Oracle 物理体系

    Oracle  物理体系 Oracle 物理体系 问题 参考资料   Oracle 物理体系       PGA:program global area ,私有不共享内存. PGA起到预处理的作用: ...

  7. 博文分类索引--Python

    Python 基础 [python]-- 初识python [python]-- 基本语法.循环 [python]-- 列表 [python]-- 元组.字典 [python]-- 字符串.字符编码与 ...

  8. js实现还可输入多少个字

    // 还可输入的字数个数 function checkLength(obj, len) { var maxChars = len; if (obj.value.length <= maxChar ...

  9. 洛谷 P2261 [CQOI2007]余数求和

    洛谷 一看就知道是一个数学题.嘿嘿- 讲讲各种分的做法吧. 30分做法:不知道,这大概是这题的难点吧! 60分做法: 一是直接暴力,看下代码吧- #include <bits/stdc++.h& ...

  10. PAT 1072. 开学寄语(20) JAVA

    下图是上海某校的新学期开学寄语:天将降大任于斯人也,必先删其微博,卸其QQ,封其电脑,夺其手机,收其ipad,断其wifi,使其百无聊赖,然后,净面.理发.整衣,然后思过.读书.锻炼.明智.开悟.精进 ...