一、文章详细页

BBS - 文章详细页、点赞、踩灭

 

文章详细页:
1.链接:
<div><h5><a href="/blog/{{ article.user.username }}/articles/{{ article.pk }}">{{ article.title }}</a></h5></div>

2.url分配:
re_path('(?P<username>\w+)/articles/(?P<article_id>\d+)/$',views.article_detail),

# 注意放在上面,否则下面得会覆盖上面得!
re_path('(?P<username>\w+)/articles/(?P<article_id>\d+)/$',views.article_detail),
re_path('(?P<username>\w+)/$',views.homesite)

3.模板继承:
因为 homesite 与 article_detail 整体页面样式,一样,只有内容部分不一样!!
继承,只传样式,没数据,怎么办? (include_tag)

知识点:
1.inclue 没有盒子得概念,某一块html直接拿来用!
{% include 'menu.html' %}

2.extends 可重写,可复用,有盒子得概念,整个页面继承.
{% extends 'base.html' %}

3.自定义标签
/blog/templatetags/my_tags.py
from django import template
register = template.Library()

@register.simple_tag
def mul(x,y):
return x*y

4.include_tag (自定义标签生成了html)
# 将 模板与数据 结合起来 (如果写函数也可以传数据,但是将模板与数据分开了)
/templatetags/my_tags.py

{% load my_tags %}
{% get_menu username %}

@register.inclusion_tag('menu.html')
def get_menu(username):
...
return {} 返回字典 去渲染 menu.html

作用:
include_tag 能解决复用问题,数据重复问题; 既有数据处理,又有模板渲染!

# -*- coding:utf-8 -*-

from django import template

register = template.Library()


@register.simple_tag
def mul(x,y):
    return x*y

from blog.models import *

@register.inclusion_tag('menu.html')
def get_menu(username):
    # 当前站点得用户对象
    user = UserInfo.objects.filter(username=username).first()
    blog = user.blog

    # 查询站点所有每一个分类 以及 对应得文章数 分组!!
    from django.db.models import Count

    # 查询站点所有每一个分类 以及 对应得文章数 分组!!
    cate_list = Category.objects.filter(blog=blog).annotate(count = Count('article')).values('title','count')

    # 每一个标签以及对应得文章数
    tag_list = Tag.objects.filter(blog=blog).annotate(count = Count('article')).values_list('title','count')

    # 查询每一个年月 日期 查询 统计
    date_list = Article.objects.filter(user=user).extra(select={"create_ym":"DATE_FORMAT(create_time,'%%Y-%%m')"}).values('create_ym').annotate(c = Count('nid')).values_list('create_ym','c')

    return {'username':username,'cate_list':cate_list,'tag_list':tag_list,'date_list':date_list}
my_tags.py

相关文章: