|
文章详情页设计思路[url设计:用户名加标识加主键值
样式为:/username/article/1
[后端路游层url设计]
先验证url是否会被其他url顶替
url(r'^(?P<username>\w+)/article/(?P<article_id>\d+)/', views.article_detail),
def article_detail(request,article_id,username):
return HttpResponse('ok')
def article_detail(request,article_id,username):
"""
应该需要校验username和article_id是否存在,但是我们这里先完成正确的情况
:param request:
:param article_id:
:param username:
:return:
"""
user_obj = models.UserInfo.objects.filter(username=username).first()
blog = user_obj.blog # 文章详情页没有blog,这个时候就可以通过参数的username获得对象,对象,blog属性得到blog
article_obj = models.Article.objects.filter(pk=article_id,blog__userinfo__username=username).first()# 文章查作者名字先通过外键blog__反向查询到userinfo__里面的(父类的)username字段
if not article_obj:
return render(request,'errors.html')
# 获取当前 文章所有的评论内容
comment_list = models.Comment.objects.filter(article=article_obj)
return render(request,'article_detail.html',locals())
[前端article detail.HTML]文章详情页和个人站点页基本一致,所以我们用模板的继承
{% extends 'base.html' %} base.html中已经写好了导航条与侧边栏的展示样式{% endblock %}
{% block content %} 自定义区域写上自己文章的内容
<h1>{{ article_obj.title }}</h1>
<div class="article_content">
{{ article_obj.content|safe }}{% endblock %}
侧边栏制作成inclusion_tag标签设计思路步骤侧边栏的渲染需要出书数据才能渲染 并且改侧边栏在很多页面都需使用
1、哪个地方用到就拷贝需要的代码 (不推荐 优点繁琐)
2、将侧边栏制作成inclusion_tag;[需要在某一个页面上传值才可以被渲染出来,并且这个页面会经常在其他页面上使用]
步骤
1、在应用下创建一个名字必须为templatetags文件夹
2、在该文件夹内创建一个任意名称的py文件
3、在该py文件内先固定书写两行代码
from django import template
register= template.Library()
[自定义过滤器-
[自定义过滤器-
[自定义
[后端代码]from django import template
from app01 import models
from django.db.models import Count
from django.db.models.functions import TruncMonth
register = template.Library()
# 自定义inclusion_tag
@register.inclusion_tag('left_menu.html')
def left_menu(username): # 把视图函数的site代码拷过来,发现只有username需要传入,那么我们就用形参传入进来即可
# 构造侧边栏需要的数据
user_obj= models.UserInfo.objects.filter(username=username).first()
blog = user_obj.blog
# 1、查询当前的用户所有分类及分类下的文章数
category_list = models.Category.objects.filter(blog=blog).annotate(count_num=Count('article__pk')).values_list(
'name', 'count_num', 'pk')
# print(category_list) #<QuerySet [('jason的分类一', 2), ('jason的分类二', 1), ('jason的分类三', 1)]>
# 2、查询所有用户下的标签空标签下文章数
tag_list = models.Tag.objects.filter(blog=blog).annotate(count_num=Count('article__pk')).values_list('name',
'count_num',
'pk')
# print(tag_list) # <QuerySet [('tank的标签一', 1), ('tank的标签二', 1), ('tank的标签三', 2)]>
# 3、按照年月统计所有时间
date_list = models.Article.objects.filter(blog=blog).annotate(month=TruncMonth('create_time')).values(
'month').annotate(count_num=Count('pk')).values_list('month', 'count_num')
# date_list = models.Article.objects.filter(blog=blog).annotate(month=TruncMonth('create_time')).values('month').annotate(count_num=Count('pk')).values_list('month', 'count_num')
# print(date_list)
return locals()
[base.html] 在侧边栏的col-md3的位置是侧边栏的位置做成通用的部分<div class="container-fluid">
<div class="row">
<div class="col-md-3">
{% load mytag %} <!--通过inclusion_tag中只需要传一个username即可-->
{% left_menu username %} <!--在base基类中提前定义好username参数,site和article_detail的html中都有都有视图函数传来的username参数,就可以使用侧边栏的方法-->
<!--这样在视图函数中的models直接通过tags.py调用了,视图函数的models直接可以省略不写了-->
</div>
<div class="col-md-9">
{% block content %}
{% endblock %}
</div>
</div>
</div>
|
|
|