[TOC=1,5]
>[success] # 双菜单组合,两者互不影响,只对数据结果影响
![](https://box.kancloud.cn/85e58626858a4f5fb510f87967473411_503x312.png)
>[danger] ##### model.py
| 表名 | 含义 |
| --- | --- |
| Category | 所有种类 |
| ArticleType | 文章类型 |
| Article | 文章保存 |
~~~
class Category(models.Model):
category = models.CharField(max_length=32)
class ArticleType(models.Model):
articletype = models.CharField(max_length=32)
class Article(models.Model):
title = models.CharField(max_length=32)
content = models.CharField(max_length=225)
category = models.ForeignKey(Category)
article_type = models.ForeignKey(ArticleType)
~~~
>[success] # 思路分析
整体的路由映射都离不开URL,所以对url,进行分析
>[danger] ##### url
~~~
1. 定义的url 参数最好要和字段名字一致
2. 所有的请求入口都是url,进行传值访问的时候要利用这点
~~~
~~~
urlpatterns = [
url(
"index/(?P<category_id>\d+)-(?P<article_type_id>\d+)",
views.index,name="index"
)
]
~~~
>[danger] ##### models.py
~~~
1.article 这个数据库和我们的category/articletype 一对多的关系
2.url 上绑定的数字,分别是上面两个表的主键
3.每次处理后的数据和处理前的url 再返回回去
~~~
~~~
def index(request,**kwargs):
if request.method == "GET":
condition = {}
for k,v in kwargs.items():
kwargs[k] = int(v)
if v == "0":
pass
else:
condition[k] = v
category = models.Category.objects.all()
articletype = models.ArticleType.objects.all()
article = models.Article.objects.filter(**condition)
return render(request,'index.html',
{
"category": category,
"articletype": articletype,
"article": article,
"kargs": kwargs
})
~~~
>[danger] ##### html
~~~
<body>
<!--category 种类的展示-->
<div>
{% if kargs.category_id == 0 %}
<a class="active" href="{% url 'index' 0 kargs.article_type_id %}">全部</a>
{% else %}
<a href="{% url 'index' 0 kargs.article_type_id %}">全部</a>
{% endif %}
{% for i in category %}
{% if i.id == kargs.category_id%}
<a class="active" href="{% url 'index' i.id kargs.article_type_id %}">{{ i.category }}</a>
{% else %}
<a href="{% url 'index' i.id kargs.article_type_id %}">{{ i.category }}</a>
{% endif %}
{% endfor %}
</div>
<div>
{% if kargs.article_type_id == 0 %}
<a class="active" href="{% url 'index' kargs.category_id 0 %}">全部</a>
{% else %}
<a href="{% url 'index' kargs.category_id 0%}">全部</a>
{% endif %}
{% for i in articletype %}
{% if i.id == kargs.article_type_id%}
<a class="active" href="{% url 'index' kargs.category_id i.id %}">{{ i.articletype }}</a>
{% else %}
<a href="{% url 'index' kargs.category_id i.id %}">{{ i.articletype }}</a>
{% endif %}
{% endfor %}
</div>
{% for i in article %}
{{ i.title }}-{{ i.content }}
{% endfor %}
~~~
>[danger] ##### 对html 优化
* 全部函数写法
~~~
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 %}
'''
if k == "article_type_id":
n1_k = arg_dict[k]
n2_k = arg_dict['category_id']
if n1_k == 0:
ret = '<a class="active" href="/article/-0-%s">全部</a>' % n2_k
else:
ret = '<a href="/article/-0-%s">全部</a>' % n2_k
return mark_safe(ret)
else:
n1_k = arg_dict[k]
n2_k = arg_dict ['article_type_id']
if n1_k == 0:
ret = '<a class="active" href="/article/-%s-0">全部</a>' % n2_k
else:
ret = '<a href="/article/-%s-0">全部</a>' % n2_k
return mark_safe(ret)
~~~
* 两菜单的写法
~~~
@register.simple_tag
def filter_article_type(article_type_list,arg_dict):
'''
{% for i in article_type_list %}
{% if i.id == arg_dict.article_type_id %}
<a class="active" href="/article/-{{ i.id }}-{{ arg_dict.category_id }}">{{ i.caption }}</a>
{% else %}
<a href="/article/-{{ i.id }}-{{ arg_dict.category_id }}">{{ i.caption }}</a>
{% endif %}
{% endfor %}
'''
ret = []
for i in article_type_list:
if i.id == arg_dict['article_type_id']:
temp = '<a class="active" href="/article/-%s-%s">%s</a>'%(i.id, arg_dict['category_id'],i.caption)
else:
temp = '<a href="/article/-%s-%s">%s</a>'%(i.id, arg_dict['category_id'],i.caption)
ret.append(temp)
#把列表转化成字符串
print(" ".join(ret))
return mark_safe(" ".join(ret))
@register.simple_tag
def filter_category(category_list,arg_dict):
'''
{% for i in category_list %}
{% if i.id == arg_dict.category_id %}
<a class="active" href="/article/-{{ arg_dict.article_type_id }}-{{ i.id }}">{{ i.caption }}</a>
{% else %}
<a href="/article/-{{ arg_dict.article_type_id }}-{{ i.id }}">{{ i.caption }}</a>
{% endif %}
{% endfor %}
'''
ret = []
for i in category_list:
if i.id == arg_dict['category_id']:
temp = '<a class="active" href="/article/-%s-%s">%s</a>' % ( arg_dict['article_type_id'],i.id, i.caption)
else:
temp = '<a href="/article/-%s-%s">%s</a>' % (arg_dict['article_type_id'],i.id, i.caption)
ret.append(temp)
# 把列表转化成字符串
print(" ".join(ret))
return mark_safe(" ".join(ret))
~~~
* 调用
~~~
<div class="condition">
<div>
{% filter_all arg_dict 'article_type_id' %}
{% filter_article_type article_type_list arg_dict%}
</div>
<div>
{% filter_all arg_dict 'category_id' %}
{% filter_category category_list arg_dict %}
</div>
~~~
- 网络原理
- 为搭建框架做准备
- 简单认识网路
- 自定义模拟网站案例
- 优化最终框架
- 数据存储 -- data
- 用户个人信息存储 -- User.txt
- 路由映射 -- routes
- 处理用户信息 -- routes_static.py
- 保存静态文件 -- static
- templates -- html 集中处理模块
- 首页 -- index.html
- 登陆 -- login.html
- 用户注册页面 -- register
- 日志模块 -- log.gua.txt
- 启动文件--server.py
- orm处理 -- model.py
- 日志模块 -- utils.py
- 两种数据库类型
- 传统数据库了解篇
- 前端快速入门
- JS简单使用入门
- css简单快速入门
- DJANGO
- virtualenv-创建虚拟环境
- 项目结构
- django-admin中文配置
- django-打印sql语句
- django-基础
- 认识MVC和MTV
- Django--初识
- Django--初识案例
- Django-FBV/CBV
- Django--常用input 交互
- Django-url
- Django-url.py 配置
- Django-include 使用
- Django-url name
- Django-ORM
- ORM-数据库配置
- ORM-model字段
- ORM-model字段解释
- ORM-字段选项
- ORM-查询
- ORM-四种常用查询方法
- ORM-三种获取数据
- ORM-其他查询方式
- ORM-条件查询双线
- ORM-Q和F条件使用
- ORM-三种数据库交互
- 案例 -- 一对多
- ORM-技巧/常见问题
- ORM-N+1 问题
- ORM-并发的处理
- ORM-数量查询、
- ORM-正向反向查询
- ORM-基础案例一
- ORM-基础一对多案例
- Django-templates
- Django-模板的继承
- Django-模板的过滤
- Django-自定义模板的过滤
- Django-cookie
- Django-cookies 装饰器
- Djang-session
- Django-CSRF
- Django-中间件 -- 后续了解
- Django- 缓存 -- 没有深入了解
- Django-form
- From-ajax
- form-内部验证处理
- form-属性
- form-常用的标签字段
- form-常用的下拉和选择
- form-widget速查
- Django-ajax序列化
- Django-多种ajax写法
- ajax-原生写法
- ajax-$写法
- ajax-ifram
- Django-ajax图片上传
- ajax-原始写法
- ajax-正常写法
- iframe+form
- 实战写法
- Django-常用自编写组件
- Django-双菜单组合搜索
- Django - 多菜单组合搜索
- Django-分页
- django-综合基础
- 综合基础-render
- django-admin
- admin-页面配置
- admin-字段配置
- admin-编辑页面
- admin-forms验证
- admin-创建抽象类
- django-验证码
- 验证码-第三方生成库
- 验证码-view.py使用
- 验证码-注意引入Monaco.ttf
- django-用户注册
- 注册-form 模块
- 注册-views 模块
- 注册-html模块
- 注册-model模块
- django-用户登录三种
- session登录
- form-session 写法
- view-写法
- Html-写法
- model-写法
- 继承类登录
- 外键关联登录
- django-简单的student 管理案例
- app-urls.py
- app-models.py配置
- admin-admin.py配置
- app-form.py 和数据库关联的写法
- app-FBV_views.py
- app-CBV_views.py
- templates-index.html
- django-博客系统
- APP目录-models.py 创建
- APP目录-基础展示数据分析
- APP目录-基础数据展示cls
- ListView
- DetailView
- FormView
- 额外功能拓建
- 添加文章搜索/用户文章查询功能
- 增加一个友情链接
- 增加一个评论模块
- App-利用Bootstrap4 搭建样式
- 项目crm
- 思维导图
- perfectCRM-项目名字
- settings.py-配置
- view.py-登陆/登出函数
- crm-app文件
- model.py-表的创建
- admin.py-注册后台
- view.py-视图层
- static-静态文件
- css
- bootstrap.min.css
- dashboard.css
- ie10-viewport-bug-workaround.css
- signin.css
- fonts
- imgs
- js
- jquery.js
- bootstrap.min.js
- holeder.js
- ie10-viewport-bug-workaround.js
- ie-emulation-modes-warning.js
- plugins
- html模板文件-templates
- crm
- index.html-首页模板