zoukankan      html  css  js  c++  java
  • 设计系统首页(文章列表渲染)

    一、系统首页导航区域

    1、让http://127.0.0.1:8000可以直接访问首页

      添加一条urls.py配置:

    urlpatterns = [
        .....
        re_path('^$', views.index),   # 访问http://127.0.0.1:8000  可以直接访问首页
    ]
    

    2、应用bootstrap快速编写index首页导航条

    (1)引入bootstrap核心文件和jquery

    <head>
        <!-- 引入 Bootstrap 核心 CSS 文件 -->
        <link rel="stylesheet" href="/static/blog/bootstrap-3.3.7/css/bootstrap.css">
        <!-- jQuery (Bootstrap 的所有 JavaScript 插件都依赖 jQuery,所以必须放在前边) -->
        <script src="/static/js/jquery-3.3.1.js"></script>
        <!-- 引入 Bootstrap 核心 JavaScript 文件 -->
        <script src="/static/blog/bootstrap-3.3.7/js/bootstrap.js"></script> <!--依赖jquery-->
    </head>
    

    (2)拷入bootstrap导航条模板代码

      

      拷贝这些代码到index页面的body标签内。

    (3)对导航条代码做适当调整

      由于我们的页面导航栏用不上,删除模板中的form标签和<li class="dropdown">标签的内容。

      

      添加导航栏栏目,编写模板语句,判定登录和未登录两种状态下导航栏右侧显示:

    <div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">
                <ul class="nav navbar-nav">
                    <li class="active"><a href="#">园子 <span class="sr-only">(current)</span></a></li>
                    <li><a href="#">新闻</a></li>
                    <li><a href="#">博问</a></li>
                    <li><a href="#">闪存</a></li>
                    <li><a href="#">小组</a></li>
                    <li><a href="#">收藏</a></li>
                    <li><a href="#">招聘</a></li>
                    <li><a href="#">班级</a></li>
                    <li><a href="#">找找看</a></li>
                </ul>
                <ul class="nav navbar-nav navbar-right">
                    {% if request.user.is_authenticated %}
                        {# 已经登录 #}
                        <li><a href="#">{{ request.user.username }}</a></li>
                        <li class="dropdown">
                        <a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true"
                           aria-expanded="false">Dropdown <span class="caret"></span></a>
                        <ul class="dropdown-menu">
                            <li><a href="#">修改密码</a></li>
                            <li><a href="#">修改头像</a></li>
                            <li><a href="/logout/">注销</a></li>
                            <li role="separator" class="divider"></li>
                            <li><a href="#">Separated link</a></li>
                        </ul>
                    </li>
                    {% else %}
                        {# 还未登录 #}
                        <li><a href="/login/">登录</a></li>
                        <li><a href="/register/">注册</a></li>
                    {% endif %}
                </ul>
            </div><!-- /.navbar-collapse -->
        </div>
    

      未登录情况下显示如下:

      

      点击登录跳转到登录页面登录,输入yuan/yuan1234和验证码后,登录成功,跳转回index首页:

      

    (4)运用用户认证组件添加logout注销功能

      首先在路由中添加logout路径:

    path('logout/', views.logout),
    

      其次在视图中编写logout视图函数:

    from django.contrib import auth   # 引入用户认证组件auth模块
    
    def logout(request):
        auth.logout(request)   # 等同于执行request.session.flush()
        return redirect("/login/")
    

      在首页点击注销操作,页面返回到登录页面,手动访问博客首页,导航栏右侧显示登录/注册按钮。

    (5)在导航栏添加小人图标

      首先在用户名前添加span标签,并添加bootstrap样式

    <ul class="nav navbar-nav navbar-right">
        {% if request.user.is_authenticated %}
            {# 已经登录 #}
            <li><a href="#"><span id="user_icon" class="glyphicon glyphicon-user"></span>{{ request.user.username }}</a></li>
            <li class="dropdown">
            <a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true"
               aria-expanded="false">Dropdown <span class="caret"></span></a>
            <ul class="dropdown-menu">
                <li><a href="#">修改密码</a></li>
                <li><a href="#">修改头像</a></li>
                <li><a href="/logout/">注销</a></li>
                <li role="separator" class="divider"></li>
                <li><a href="#">Separated link</a></li>
            </ul>
        </li>
        {% else %}
            {# 还未登录 #}
            <li><a href="/login/">登录</a></li>
            <li><a href="/register/">注册</a></li>
        {% endif %}
    </ul>
    

      注意bootstrap的Glyphicons 字体图标使用:

      

      调整小人图标样式:

    <style>
        #user_icon {
            font-size: 18px;  /*调整大小*/
            margin-right: 10px;   /*调整距离*/
            vertical-align: -3px;  /*调整高度*/
        }
    </style>
    

       显示效果如图所示:

      

    二、系统首页主体布局

      利用bootstrap提供的栅格系统,将页面按3-6-3的比例划分:

    <div class="container-fluid">
        <div class="row">
            <div class="col-md-3">111</div>
            <div class="col-md-6">222</div>
            <div class="col-md-3">333</div>
        </div>
    </div>
    

      左右两个部分先不做,暂时使用bootstap的面板进行填充:

    <div class="panel panel-warning">
        <div class="panel-heading">Panel heading without title</div>
        <div class="panel-body">
            Panel content
        </div>
    </div>
    

      显示效果如下所示:

      

    三、Django的admin组件介绍及使用

      admin是Django内部的一个组件:后台数据管理组件(WEB页面)。admin并不是项目必需的。

    1、创建用户认证组件超级用户来登录和使用admin组件页面

    (venv) MacBook-Pro:cnblog hqs$ python3 manage.py createsuperuser
    Username: alex
    Email address:  
    Password: 
    Password (again): 
    Superuser created successfully.
    

      创建好新的超级用户的账号密码:alex/alex1234,访问admin页面:

      

      登录成功后显示如下:

      

    2、admin注册

      在cnblog/blog/admin.py里引入models,并以如下方式注册表:

    from django.contrib import admin
    
    # Register your models here.
    from blog import models
    
    admin.site.register(models.UserInfo)   # 用户信息表
    admin.site.register(models.Blog)
    admin.site.register(models.Category)
    admin.site.register(models.Tag)
    admin.site.register(models.Article)    # 文章表
    admin.site.register(models.ArticleUpDown)   # 文章点赞表
    admin.site.register(models.Article2Tag)
    admin.site.register(models.Comment)   # 评论表
    

      注册完成后,页面如下所示:

      

    3、如何利用admin录入文章数据

    (1)创建博客对象

      

      创建好的博客对象如下所示:

      

    (2)博客对象和用户绑定一对一关系

      如下所示将alex绑定曹刘社区,yuan绑定yuan个人博客。

      

    (3)在Articles表里录入文章数据

      

      填写并保存文章,发现admin强行限制Category(分类)必须得加。

      添加category对象:

      

      文章添加成功:

      

    四、系统首页的文章列表渲染

    1、拿到当前所有文章对象传递到index首页

    views.py:

    from blog import models
    
    def index(request):
        # 拿到当前所有的文章
        article_list = models.Article.objects.all()
        return render(request, "index.html", {"article_list": article_list})
    

    2、首页文章列表初步渲染

    index.html:

    <!--文章列表部分-->
    <div class="col-md-6">
        <div class="article_list">
            {% for article in article_list %}
                <div class="article-item">
                    <h5><a href="">{{ article.title }}</a></h5>
                    <div class="article-desc">
                        <span class="media-left">
                            {# 用户头像 #}
                            <a href=""><img width="56" height="56" src="media/{{ article.user.avatar }}" alt=""></a>
                        </span>
                        <span class="media-right">
                            {# 文章摘要 #}
                            {{ article.desc }}
                        </span>
                    </div>
                </div>
                <hr>
            {% endfor %}
        </div>
    </div>
    

    注意:

      (1)浏览器访问头像路径一定要在前面拼接media别名

    <div class="article-desc">
        <span>
            <a href=""><img width="56" height="56" src="media/{{ article.user.avatar }}" alt=""></a>
        </span>
    </div>
    

      (2)获取文章摘要信息

    <span class="media-right">
        {# 文章摘要 #}
        {{ article.desc }}
    </span>
    

      (3)利用bootstrap提供的media-left和media-right调整文章样式,添加<hr>标签分隔文章块。

    显示效果如下:

      

    3、进一步渲染文章列表详细信息

    index.html:

    <!--文章下方详细信息-->
    <div class="small pub_info">
        {# 作者 #}
        <span><a href="">{{ article.user.username }}</a></span>    
        {# 文章发布时间 #}
        <span>发布于  {{ article.create_time|date:"Y-m-d H:i" }}</span>   
        {# 评论数 #}
        <span class="glyphicon glyphicon-comment"></span> 评论({{ article.comment_count }})  
        {# 点赞数 #}
        <span class="glyphicon glyphicon-thumbs-up"></span> 点赞({{ article.up_count }})
    </div>
    

    注意:

    (1)日期显示需要修改时区,修改settings.py中的TIME_ZONE字段

    # TIME_ZONE = 'UTC'
    TIME_ZONE = "Asia/Shanghai"
    

    (2)引入bootstrap的Glyphicons字体图标显示评论图标和点赞图片

    {# 评论数 #}
    <span class="glyphicon glyphicon-comment">评论({{ article.comment_count }})</span>   
    {# 点赞数 #}
    <span class="glyphicon glyphicon-thumbs-up">点赞({{ article.up_count }})</span>
    

    (3)在这里发现模型中Article类的评论、点赞计数字典没有添加,系统报错

    comment_count = models.IntegerField(default=0)
    up_count = models.IntegerField(default=0)
    down_count = models.IntegerField(default=0)
    

       添加上述代码后,再次执行数据库迁移命令:

    $ python3 manage.py makemigrations
    
    $ python3 manage.py migrate
    

     (4)样式调整,给这个详情信息区域添加class="small",让字体变小外,通过CSS调整图标样式

    <style>
        #user_icon {
            font-size: 18px; /*调整大小*/
            margin-right: 10px; /*调整距离*/
            vertical-align: -3px; /*调整高度*/
        }
        .pub_info {
            margin-top: 10px;
    
        }
        .pub_info .glyphicon-comment {
            vertical-align: -1px;
        }
    </style>
    

    显示效果:

      

  • 相关阅读:
    du
    date
    echo
    redis的多实例
    redis相关配置
    mariadb的安装与主从复制
    11.Flask-钩子函数
    Python之Linux下的virtualenv&&virtualenvwrapper
    Linux的防火墙概念
    安装ipython解释器
  • 原文地址:https://www.cnblogs.com/xiugeng/p/9396593.html
Copyright © 2011-2022 走看看