多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
[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> ~~~