十五、Django2.1 搭建多用户的博客网站——文章模块小结

96
麦典威
1.2 2019.02.17 22:12* 字数 844

目录:Django 2.1 从零开始搭建博客网站系列

服务器环境搭建(选学)

小试牛刀——简单的博客网站

庖丁解牛——多用户的博客网站之用户模块

庖丁解牛——多用户的博客网站之文章模块

华丽转身——多用户的博客网站之扩展功能

项目源码下载:https://github.com/jt1024/lehehe

正文:

1、完善导航栏

实现在首页导航栏可以查看所有文章。
在 ./templates/header.html 的

<li><a href="{% url 'blog:blog_list' %}">BLOG</a></li>

下面增加如下代码

<li><a href="{% url 'article:article_titles' %}">文章</a></li>

访问http://127.0.0.1:8000/home/ 可以看到导航栏中新增了“文章”栏目,如图:

新增文章栏目

点击“文章”,可显示所有作者的文章,如图:


文章栏目列表

2、展示某一作者的所有文章

有的用户想要查看某一作者的所有文章,我们需要实现点击作者姓名就能展示这个作者的文章列表。

首先在 ./templates/article/list/article_titles.html 中给“作者”添加超链接,代码如下

<p class="list-group-item-text">作者:<a href="{% url 'article:author_articles' article.author.username %}">{{article.author.username}}</a></p>

接着,我们新增一条路由

path('list-article-titles/<username>/', list_views.article_titles, name="author_articles"),

然后,我们修改 ./article/list_views.py 中的 article_titles 方法

from django.shortcuts import render, get_object_or_404
from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
from .models import ArticlePost
from django.contrib.auth.models import User


def article_titles(request, username=None):
    if username:
        user = User.objects.get(username=username)
        articles_title = ArticlePost.objects.filter(author=user)
        try:
            userinfo = user.userinfo
        except:
            userinfo = None
    else:
        articles_title = ArticlePost.objects.all()

    paginator = Paginator(articles_title, 2)
    page = request.GET.get('page')
    try:
        current_page = paginator.page(page)
        articles = current_page.object_list
    except PageNotAnInteger:
        current_page = paginator.page(1)
        articles = current_page.object_list
    except EmptyPage:
        current_page = paginator.page(paginator.num_pages)
        articles = current_page.object_list

    if username:
        return render(request, "article/list/author_articles.html", {"articles": articles, "page": current_page, "userinfo": userinfo, "user": user})
    return render(request, "article/list/article_titles.html", {"articles": articles, "page": current_page})


def article_detail(request, id, slug):
    article = get_object_or_404(ArticlePost, id=id, slug=slug)
    return render(request, "article/list/article_content.html", {"article": article})

最后,创建 ./templates/article/list/ author_articles.html

{% extends "base.html" %}
{% load staticfiles %}
{% block title %}articles{% endblock %}
{% block content %}
<div class="row text-center vertical-middle-sm">
    <h1>阅读,丰富头脑,善化行为</h1>
</div>
<div class="container">
    <div class="col-md-8">
        {% for article in articles %}
        <div class="list-group">
            <a href="{{article.get_url_path}}" class="list-group-item active">
                <h4 class="list-group-item-heading">{{article.title}}</h4>
            </a>
            <p class="list-group-item-text">作者:
                <a href="{% url 'article:author_articles' article.author.username %}">{{article.author.username}}</a>
            </p>
            <p class="list-group-item-text">概要:{{article.body|slice:'70'|linebreaks}} </p>
        </div>
        {% endfor %}
        {% include "paginator.html" %}
    </div>
    <div class="col-md-4">
        <div>
            {% if userinfo.photo %}
            <img src="{{ userinfo.photo | striptags }}" class="img-circle" id="my_photo" name="user_face" style="width: 300px">
            {% else %}
            <img name="user_face" src="{% static 'images/newton.jpg' %}" class="img-circle" id="my_photo" style="width: 300px">
            {% endif %}
        </div>
        <div>
            <p>{{ user.username }}</p>
            {% if userinfo %}
            <p>{{ userinfo.company }}</p>
            <p>{{ userinfo.aboutme }}</p>
            {% else %}
            <p>这个作者太懒了,什么也没有留下。</p>
            {% endif %}
        </div>
    </div>
</div>
{% endblock %}

此时,运行Django 在文章列表点击某一个作者,会展示如图页面:


作者文章列表