本渣渣不专注技术,只专注使用技术,不是一个资深的coder,是一个不折不扣的copier |
在 Django个人博客开发九 | 整理项目结构 结构梳理章节已经分析过了,分类页面、归档页面、标签页面都是都是一样的,只是路由不一样而已
所以这里以 生活笔记、关于自己为例讲解这一类页面
1、渲染分类页面数据
首先制作一个四区模板,也即文章列表模块
在 blog -> templates 中新建文件 content.html
生活笔记分类
blog -> templates -> content.html
{%extends 'base_right.html'%} {% block description %} <meta name="description" content="{% get_title category as c %}{{ c.description }}"/> {% endblock description %} {% block keywords %} <meta name="keywords" content="{% get_title category as c %}{{ c.keywords }}"/> {% endblock keywords %} {% block title %}{% get_title category as c %}静觅丨{{ c.name }}{% endblock title %} {% block body %} <div class="content-wrap"> <div class="content"> <header class="archive-header"> <h1><i class="fa fa-folder-open"></i> 分类:{{ category }} <a title="订阅福利专区" target="_blank" href="{% url 'blog:category' resources '' %}"><i class="rss fa fa-rss"></i></a> </h1> </header> {% for article in page_obj %} <article class="excerpt"> <header> <a class="label label-important" href="/category/{{ article.category.bigcategory.name }}/{{ article.category.name|lower }}">{{ article.category.name }}<i class="label-arrow"></i></a> <h2><a target="_blank" href="/article/{{ article.slug }}" title="{{ article.title }}">{{ article.title }} </a></h2> </header> <div class="focus"><a target="_blank" href="/article/{{ article.slug }}"> <img class="thumb" width="200" height="123" src="{{ article.img_link }}" alt="{{ article.title }}" /></a> </div> <span class="note"> {{ article.summary }}</span> <p class="auth-span"> <span class="muted"><i class="fa fa-user"></i> <a href="/author/{{ article.author }}">{{ article.author }}</a></span> <span class="muted"><i class="fa fa-clock-o"></i> {{ article.create_date|date:'Y-m-d'}}</span> <span class="muted"><i class="fa fa-eye"></i> {{ article.views }}浏览</span> <span class="muted"><i class="fa fa-comments-o"></i> <a target="_blank" href="/article/{{ article.slug }}#comments">评论</a></span> <span class="muted"><a href="javascript:;" data-action="ding" data-id="455" id="Addlike" class="action"> <i class="fa fa-heart-o"></i><span class="count">{{ article.love }}</span>喜欢</a> </span> </p> </article> {% empty %} <div class="no-post">当前分类下还没有发布的文章!</div> {% endfor %} {% if is_paginated %} <div class="pagination"> <ul> {% if first %} <li><a href="?page=1">1</a></li> {% endif %} {% if left %} {% if left_has_more %} <li><span>...</span></li> {% endif %} {% for i in left %} <li class="prev-page"><a href="?page={{ i }}">{{ i }}</a></li> {% endfor %} {% endif %} <li class="active"><a href="?page={{ page_obj.number }}">{{ page_obj.number }}</a></li> {% if right %} {% for i in right %} <li class="next-page"><a href="?page={{ i }}">{{ i }}</a></li> {% endfor %} {% if right_has_more %} <li><span>...</span></li> {% endif %} {% endif %} {% if last %} <li><a href="?page={{ paginator.num_pages }}">{{ paginator.num_pages }}</a></li> {% endif %} </ul> </div> {% endif %} </div> </div> {%endblock body%}
自定义模板标签
blog -> templatetags -> blog_tags.py
@register.simple_tag def get_title(category): a = BigCategory.objects.filter(slug=category) if a: return a[0]
头部引入
{% load blog_tags %}
首页 大分类跳转地址
<a href="{% url 'blog:category' big.slug '' %}">{{ big.name }}</a>
首页大分类下拉菜单小分类地址
<a href="{% url 'blog:category' big.slug c.slug %}">{{ c.name }}</a>
配置路由
# 分类页面 url(r'^category/(?P<bigslug>.*?)/(?P<slug>.*?)', IndexView.as_view(template_name='content.html'), name='category'),
运行查看效果
简单理解路由,这里都是我的个人理解可能不会有官方文档解释的科学,如果读完还有疑惑不要纠结,问题不大,刚开始接触不需要理解的太深入。
{% url 'blog:category' big.slug '' %}
big.slug:是从 bigcategory 表取出的数据,是导航菜单,大分类字段
Django 的路由其实就是使用正则表达式匹配前端 http 请求的路径
http 请求可以理解为,前台的点击事件,比如用户点击 生活笔记 或者 个人随笔
就是告诉服务器我想看这些内容,那么怎么告诉,就是发送 http 请求,这里 {% url 'blog:category' big.slug '' %} 就是 Django 模板定义请求路径的方式
blog:主路由 url('', include('storm.urls', namespace='blog')), 定义应用空间名 namespace 为 blog,这样后台修改应用 storm 名不会影响前台渲染数据,和配置静态路径一样的道理
category:是storm应用路由 url(r'^category/(?P
比如 这里用户点击生活笔记,那么他的请求路经是
浏览器解析
{% url 'blog:category' big.slug '' %}
后路径即为
http://stormsha.com/category/diary
则 Django 首先去 项目容器 blog -> blog -> urls.py 中匹配这个路径,匹配的规则是首先精准匹配这个路径,就是拿 category 去对比 路由的第一个参数
发现没有 category,如果未匹配到,则进行模糊匹配,就是直接走路由第一个参数为空的路由,那么就进到了
url('', include('storm.urls', namespace='blog')) 这里,include 的第一个参数指向的是子路由位置,
通过这里进入 blog -> storm -> urls.py 继续拿 category 匹配路径,在这里匹配到了
url(r'^category/(?P<bigslug>.*?)/(?P<slug>.*?)', IndexView.as_view(template_name='content.html'), name='category')
好了第一个http请求已经找到归宿
{% url 'blog:category' big.slug '' %}
big.slug:第一个参数 就是 diary,通过 正则匹配到 diary
'':第二个参数为空,因为这里请求的是大分类,但是大分类和小分类这里使用的是同一个路由,所以要置空
如果 用户点击个人随笔,那么请求的路经是 http://stormsha.com/category/diary/life
{% url 'blog:category' big.slug c.slug %}
big.slug:第一个参数,是从数据库中取出的大分类,即为 diary
c.slug:第二个参数是从 category表取出的文章分类字段,即为 life
关于自己
关于自己(about)、给我留言((message)、赞助作者(donate)、技术交流(exchange)、提问交流(question)、项目合作(project)、属于同一类页面,都是静态展示页面 所以要单独创建页面
blog -> templates -> about.html
这里是静态页面,直接拷贝Github 项目中对应页面代码即可
配置路由
url(r'^category/about/$', AboutView, name='about'),
创建视图
def AboutView(request): return render(request, 'about.html', {'category': 'about'})
运行查看效果
2、总结方法
生活笔记、技术杂谈、福利专区、生活笔记下拉菜单、技术杂谈下拉菜单、标签云、归档、都属于同一类,模仿实现即可
对比项目源码Github,理解视图和 Templatetags 的用法套路
关于自己、给我留言、赞助作者、技术交流、提问交流、项目合作属于同一类模仿实现即可
【友情提示】——如果发现有表达错误,或者知识点错误,或者搞不懂的地方,请及时留言,可以在评论区互相帮助,让后来者少走弯路是我的初衷。我也是一步步摸着石头走过来的,深知网络上只言片语的图文教程,给初学者带来的深深困扰。
【建议】——在对项目结构不太熟悉时,参照完整源码少走弯路
转载请注明: StormSha » Django个人博客开发十一 | 博客首页开发三