【1】需求分析
【2】路由映射
- 这个URL模式表示一个路由,它匹配一个以
/
开头的URL,后面跟着一个可选的username
参数。
urlpatterns = [
path('admin/', admin.site.urls),
path('',home,name="home"),
path('<slug:username>/', site, name="site")]
【3】视图函数
def site(request, username, *args, **kwargs):
# 【一】获取到当前用户的用户名,根据指定的用户名筛选出指定的文章
# 从文章表跨到个人站点表再跨到用户表 根据用户名筛选出指定的用户数据
article_data_all = Article.objects.filter(blog__userinfo__username=username)
return render(request, "site.html", locals())
【4】前端页面
【1】注册侧边栏+个人站点页
{% extends 'home.html' %}
{% block content_outer %}
<div class="container-fluid">
<div class="row">
<div class="col-md-2">
{# 加载 inclusion_tag #}
{% load CommonInclusionTags %}
{% article_left request %}
</div>
<div class="col-md-10">
<div class="pull-right">随笔 - {{ article_data_all.count }}</div>
<hr>
{# {% for article_obj in article_data_all %} #}
{% for article_obj in page_queryset %}
<div class="media">
<div class="media-heading"><h4><a href="">{{ article_obj.title }}</a></h4></div>
<div class="media-body">[摘要] {{ article_obj.desc }}</div>
<br>
<div class="media-bottom pull-right">
posted
@ {{ article_obj.create_time|date:"Y-m-d H:i:s" }}
<a href="">{{ article_obj.blog.userinfo.username }}</a>
点赞({{ article_obj.up_num }}) 评论({{ article_obj.comment_num }})
点踩({{ article_obj.down_num }})
<a href="">编辑</a>
</div>
</div>
<hr>
{% endfor %}
<div class="text-center">
{{ page_obj.page_html|safe }}
</div>
</div>
</div>
</div>
{% endblock %}
【2】后端
def site(request, username, condition=None, params=None, *args, **kwargs):
# 【一】获取到当前用户的用户名,根据指定的用户名筛选出指定的文章
# 从文章表跨到个人站点表再跨到用户表 根据用户名筛选出指定的用户数据
# 所有的文章数据
article_data_all = Article.objects.filter(blog__userinfo__username=username)
# print(condition) # category archive
# print(params, type(params)) # 1 <class 'str'> 2022-06 <class 'str'>
if condition and params:
# 判断当前是文章分类下的文章
if condition == "category":
article_data_all = Article.objects.filter(category__pk=int(params))
# 判断当前是文章标签下的文章
elif condition == "tag":
article_data_all = Article.objects.filter(tags__pk=int(params))
# 判断当前是文章归档下的文章
elif condition == "archive":
year, month = params.split("-")
article_data_all = Article.objects.filter(create_time__year=year, create_time__month=month)
# 判断当前路径不是我们想要的路由直接重定向回个人站点页
else:
return redirect("site", (username))
# 获取到当前的页数
current_page = request.GET.get("page", 1)
# 获取到当前数据量的总数
all_count = article_data_all.count()
# 生成分页器对象
page_obj = Pagination(current_page=current_page, all_count=all_count, per_page_num=5)
# 对源数据进行切割
page_queryset = article_data_all[page_obj.start:page_obj.end]
print(page_queryset)
return render(request, "site.html", locals())
【3】路由
urlpatterns = [
path('admin/', admin.site.urls),
#文章详情页
path('<slug:username>/article/<int:pk>/', article_detail,name="article_detail"),
path('<slug:username>/<str:condition>/<slug:params>/', site, name="article_site"),
path('backend/',include("backend.urls")),
]