一、页面展示
二、分析
通过对url的分析,暂时我们可以归结出来搜索的思路,应用了url映射关系,分别对应数据库的查询,结果查询对应的两个条件都是一对多。
-
构造数据库
文章库分别和文本类型,以及部门表为一对多关系映射
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)
concent = models.CharField(max_length=225)
category = models.ForeignKey(Category)
article_type = models.ForeignKey(ArticleType)
-
创建url
url的思路是创建,一个url对应一组数据,这里要注意的是当我们在给url设置对应名称时,这里最好和数据库中的字段名对应
url(r'^article/-(?P<article_type_id>\d+)-
(?P<category_id>\d+)',views.article,name='article')
-
views 层的编写
1.分别展示三个库的内容
2.展示文本内容时,要注意用过滤条件的筛选
3.当我们触发按钮时要保证,连接只改变我们点击的查询项,做图片说明
通过图片可以看出只改变前面的不改变后面的
4.所以前后两个,是需要两个无关联参数才能做到
5.我们一组关联是数据库,另外一组用连接返回的参数
def article(request,**kwargs):
也就是这里的kwargs
def article(request,**kwargs):
condition = {}
# url = reverse('article',kwargs=kwargs)
for k,v in kwargs.items():
#我们要把链接的str转成int
kwargs[k] = int(v)
if v == "0":
pass
else:
#字典的循环是每个键值对的循环
condition[k] = v
article_type_list = models.ArticleType.objects.all()
category_list = models.Category.objects.all()
resutl = models.Article.objects.filter(**condition)
return render(
request,
"article.html",
{
'result':resutl,
'article_type_list':article_type_list,
'category_list':category_list,
'arg_dict':kwargs,
}
)
-
html
1.连接用返回查询数据库的id值
2.接收上一个连接的返回值
<body>
<h1>过滤条件</h1>
<div class="condition">
<div>
{% 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 %}
{% 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 %}
</div>
<div>
{% 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 %}
{% 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 %}
</div>
</div>
<h1>插询结果</h1>
<ul>
{% for i in result %}
<li>{{ forloop.counter }}{{ i.title }}</li>
{% endfor %}
</ul>
</body>
-
升级改造版
1.用标签simple_tag:
a.在app中创建templatetags文件
b.创建任意.py文件
要注意如果是一组连接使用数组,分装然后再拼接返回
-
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)
- html 展示的写法
@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))
-
html
<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>