个人站点文章

【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】注册侧边栏+个人站点页

image-20240320165534924

{% 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">[摘要] &nbsp; {{ 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 %}
image-20240320165804386

【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")),

]
posted @ 2024-03-29 11:23  -半城烟雨  阅读(0)  评论(0编辑  收藏  举报