母版
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>{{ blog.title }}</title>
<link rel="stylesheet" href="/static/bootstrap/css/bootstrap.min.css">
<link rel="stylesheet" href="/static/fontawesome/css/font-awesome.min.css">
<link rel="stylesheet" href="/static/mystyle.css">
<link rel="stylesheet" href="/static/theme/{{ blog.theme }}">
<script src="/static/jquery-3.3.1.js"></script>
<script src="/static/bootstrap/js/bootstrap.min.js"></script>
</head>
<body>
<div class="header">
<p>{{ blog.title }}</p>
</div>
<div class="container">
<div class="col-md-3">
//自定义simple_tag,传入参数,渲染left_menu.HTML文件,返回HTML文件
{% load my_tags %}
{% get_left_menu username %}
</div>
<div class="col-md-8">
//导入page-main块
{% block page-main %}
{% endblock %}
</div>
</div>
my_tags.py
from django import template
from blog import models
from django.db.models import Count
register = template.Library()
@register.inclusion_tag("left_menu.html")
def get_left_menu(username):
user = models.UserInfo.objects.filter(username=username).first()
blog = user.blog
# 查询文章分类及对应的文章数
category_list = models.Category.objects.filter(blog=blog).annotate(c=Count("article")).values("title", "c")
# 查文章标签及对应的文章数
tag_list = models.Tag.objects.filter(blog=blog).annotate(c=Count("article")).values("title", "c")
# 按日期归档
archive_list = models.Article.objects.filter(user=user).extra(
select={"archive_ym": "date_format(create_time,'%%Y-%%m')"}
).values("archive_ym").annotate(c=Count("nid")).values("archive_ym", "c")
return {
"username": username,
"category_list" :category_list,
"tag_list": tag_list,
"archive_list": archive_list
}
simple_tag的HTML文件渲染左侧标签分类
<div class="panel panel-primary">
<div class="panel-heading">文章分类</div>
<div class="panel-body">
{% for category in category_list %}
<p><a href="/blog/{{ username }}/category/{{ category.title }}/">{{ category.title }}({{ category.c }})</a></p>
{% endfor %}
</div>
</div>
<div class="panel panel-warning">
<div class="panel-heading">文章标签</div>
<div class="panel-body">
{% for tag in tag_list %}
<p><a href="/blog/{{ username }}/tag/{{ tag.title }}/">{{ tag.title }}({{ tag.c }})</a></p>
{% endfor %}
</div>
</div>
<div class="panel panel-info">
<div class="panel-heading">日期归档</div>
<div class="panel-body">
{% for archive in archive_list %}
<p><a href="/blog/{{ username }}/archive/{{ archive.archive_ym }}/">{{ archive.archive_ym }}({{ archive.c }})</a></p>
{% endfor %}
</div>
</div>
home.html
{% extends 'base.html' %}
{% block page-main %}
<!-- 个人博客列表 开始-->
<div class="article-list">
{% for article in article_list %}
<div class="article">
//博客文章标题,链接指向详情页
<p class="article-title"><a
href="/blog/{{ article.user.username }}/article/{{ article.pk }}/">{{ article.title }}</a></p>
<div class="media">
//显示个人图像,链接指向个人博客主页
<div class="media-left">
<a href="/blog/{{ article.user.username }}/">
<img class="media-object author-img" src="/media/{{ article.user.avatar }}" alt="...">
</a>
</div>
//文章描述
<div class="media-body">
<p>{{ article.desc }}</p>
</div>
</div>
<div class="article-footer">
<span><a href="/blog/{{ article.user.username }}/">{{ article.user.username }}</a></span>发布于
<span>{{ article.create_time|date:'Y-m-d H:i:s' }}</span>
<span><i class="fa fa-commenting-o fa-fw"
aria-hidden="true"></i>评论({{ article.comment_count }})</span>
<span><i class="fa fa-thumbs-o-up fa-fw"
aria-hidden="true"></i>点赞({{ article.up_count }})</span>
</div>
<hr>
</div>
{% endfor %}
</div>
<!-- 个人博客列表 结束-->
{% endblock %}
博客详情页
{% extends 'base.html' %}
{% block page-main %}
<div class="article-detail">
<h1>{{ article.title }}</h1>
<p>{{ article.articledetail.content|safe }}</p>
</div>
{% endblock %}
路由
from django.conf.urls import url, include
from blog import urls as blog_urls
urlpatterns = [
url(r'^blog/', include(blog_urls)),
]
from django.conf.urls import url
from blog import views
urlpatterns = [
url(r'(\w+)/(tag|category|archive)/(.+)/', views.home), # 此分类博客文章
url(r'(\w+)/article/(\d+)/$', views.article_detail), # 文章详情
url(r'(\w+)', views.home), #个人主页
]
视图
# 个人博客主页
def home(request, username, *args):
logger.debug("home视图获取到用户名:{}".format(username))
# 去UserInfo表里把用户对象取出来
user = models.UserInfo.objects.filter(username=username).first()
if not user:
logger.warning("又有人访问不存在页面了...")
return HttpResponse("404")
# 如果用户存在需要将TA写的所有文章找出来
blog = user.blog
if not args:
logger.debug("args没有接收到参数,默认走的是用户的个人博客页面!")
# 我的文章列表
article_list = models.Article.objects.filter(user=user)
else:
#按照文章分类选文章
if args[0] == "category":
article_list = models.Article.objects.filter(user=user).filter(category__title=args[1])
#按照标签分类选择文章
elif args[0] == "tag":
article_list = models.Article.objects.filter(user=user).filter(tags__title=args[1])
else:
# 按照日期分类选择
try:
year, month = args[1].split("-")
logger.debug("分割得到参数year:{}, month:{}".format(year, month))
logger.debug("************************")
article_list = models.Article.objects.filter(user=user).filter(
create_time__year=year, create_time__month=month
)
except Exception as e:
logger.warning("请求访问的日期归档格式不正确!!!")
logger.warning((str(e)))
return HttpResponse("404")
return render(request, "home.html", {
"username": username,
"blog": blog,
"article_list": article_list,
})
def article_detail(request, username, pk):
"""
:param username: 被访问的blog的用户名
:param pk: 访问的文章的主键id值
:return: 返回字符串替换HTML文件
"""
user = models.UserInfo.objects.filter(username=username).first()
if not user:
return HttpResponse("404")
blog = user.blog
# 找到当前的文章
article_obj = models.Article.objects.filter(pk=pk).first()
# 所有评论列表
comment_list=models.Comment.objects.filter(article_id=pk)
return render(
request,
"article_detail.html",
{
"username": username,
"article": article_obj,
"blog": blog,
"comment_list":comment_list
})