DAY 60 django15

1 注册
2 登录
3 验证码生成
4 验证码刷新
5 首页布局

1 首页布局

<!DOCTYPE html>
<html lang="en">
<head>
   <meta charset="UTF-8">
   <title>首页</title>
   <link rel="stylesheet" href="/static/bootstrap-3.3.7-dist/css/bootstrap.min.css">
   <link rel="stylesheet" href="/static/font-awesome-4.7.0/css/font-awesome.min.css">
   <script src="/static/jquery-3.3.1.js"></script>
   <script src="/static/bootstrap-3.3.7-dist/js/bootstrap.min.js"></script>
   <style>
       .article_footer{
           margin-right: 10px;
      }
   </style>
</head>
<body>
<div class="head">
   <nav class="navbar navbar-default">
       <div class="container-fluid">
           <!-- Brand and toggle get grouped for better mobile display -->
           <div class="navbar-header">
               <button type="button" class="navbar-toggle collapsed" data-toggle="collapse"
                       data-target="#bs-example-navbar-collapse-1" aria-expanded="false">
                   <span class="sr-only">Toggle navigation</span>
                   <span class="icon-bar"></span>
                   <span class="icon-bar"></span>
                   <span class="icon-bar"></span>
               </button>
               <a class="navbar-brand" href="#">博客园</a>
           </div>

           <!-- Collect the nav links, forms, and other content for toggling -->
           <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>

               </ul>
              {% if request.user.is_authenticated %}
                   <ul class="nav navbar-nav navbar-right">
                       <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">更多操作 <span class="caret"></span></a>
                           <ul class="dropdown-menu">
                               <li><a href="#">修改密码</a></li>
                               <li><a href="#">修改头像</a></li>
                               <li><a href="#">后台管理</a></li>
                               <li role="separator" class="divider"></li>
                               <li><a href="/logout/">退出</a></li>
                           </ul>
                       </li>
                   </ul>
              {% else %}
                   <ul class="nav navbar-nav navbar-right">
                       <li><a href="/login/">登录</a></li>
                       <li><a href="/register/">注册</a></li>
                   </ul>
              {% endif %}

           </div><!-- /.navbar-collapse -->
       </div><!-- /.container-fluid -->
   </nav>
</div>
<div class="container-fluid">


   <div class="row">
       <div class="col-md-2">
           <div class="panel panel-success">
               <div class="panel-heading">
                   <h3 class="panel-title">广告位招租</h3>
               </div>
               <div class="panel-body">
                  重金求子:<a href="">点我看美女</a>
               </div>
           </div>
           <div class="panel panel-info">
               <div class="panel-heading">
                   <h3 class="panel-title">老刘说书</h3>
               </div>
               <div class="panel-body">
                   <ul class="list-group">
                       <li class="list-group-item">红楼梦</li>
                       <li class="list-group-item">西游记</li>
                       <li class="list-group-item">洪流吗</li>

                   </ul>
               </div>
           </div>

       </div>
       <div class="col-md-7">
           <div>

               <div id="carousel-example-generic" class="carousel slide" data-ride="carousel">


                   <ol class="carousel-indicators">
                       <li data-target="#carousel-example-generic" data-slide-to="0" class="active"></li>
                       <li data-target="#carousel-example-generic" data-slide-to="1"></li>
                       <li data-target="#carousel-example-generic" data-slide-to="2"></li>
                   </ol>
                   <div class="carousel-inner" role="listbox">

                      {% for banner in banner_list %}
                          {% if forloop.first %}
                               <div class="item active">
                                   <img src="{{ banner.url }}" alt="...">
                                   <div class="carousel-caption">
                                      {{ banner.name }}
                                   </div>
                               </div>
                          {% else %}
                               <div class="item">
                                   <img src="{{ banner.url }}" alt="...">
                                   <div class="carousel-caption">
                                      {{ banner.name }}
                                   </div>
                               </div>
                          {% endif %}
                      {% endfor %}



                       <a class="left carousel-control" href="#carousel-example-generic" role="button"
                          data-slide="prev">
                           <span class="glyphicon glyphicon-chevron-left" aria-hidden="true"></span>
                           <span class="sr-only">Previous</span>
                       </a>
                       <a class="right carousel-control" href="#carousel-example-generic" role="button"
                          data-slide="next">
                           <span class="glyphicon glyphicon-chevron-right" aria-hidden="true"></span>
                           <span class="sr-only">Next</span>
                       </a>

                   </div>

               </div>


           </div>

           <div class="article" style="margin-top: 20px">
              {% for article in article_list %}
                   <div>
                       <h4 class="media-heading"><a href="">{{ article.title }}</a></h4>
                       <div class="media">
                           <div class="media-left media-middle">
                               <a href="#">
{#                                    <img class="media-object" src="media/{{ article.blog.userinfo.avatar }}" alt="..." height="60px" width="60px">#}
                                   <img class="media-object" src="https://pic.cnblogs.com/face/1921007/20200116181302.png" height="60px" width="60px">
                               </a>
                           </div>
                           <div class="media-body">
                              {{ article.desc }}

                           </div>
                           <div style="margin-top: 10px">
                               <span class="article_footer"><a href="">{{ article.blog.userinfo.username }}</a></span>
                               <span class="article_footer">{{ article.create_time|date:'Y-m-d H:i:s' }}</span>
{#                                <span class="glyphicon glyphicon-thumbs-up article_footer">&nbsp;{{ article.up_num }}</span>#}
                               <span class="article_footer"><i class="fa fa-comment-o fa-lg"></i>&nbsp;{{ article.up_num }}</span>
                               <span class="article_footer"><i class="fa fa-home fa-lg"></i>&nbsp;{{ article.down_num }}</span>
                               <span class='article_footer'><i class="fa fa-frown-o fa-lg"></i>&nbsp;{{ article.commit_num }}</span>
                           </div>
                       </div>
                       <hr>
                   </div>
              {% endfor %}


           </div>
       </div>

       <div class="col-md-3">

           <div class="panel panel-success">
               <div class="panel-heading">
                   <h3 class="panel-title">广告位招租</h3>
               </div>
               <div class="panel-body">
                  重金求子:<a href="">点我看美女</a>
               </div>
           </div>
           <div class="panel panel-info">
               <div class="panel-heading">
                   <h3 class="panel-title">老刘说书</h3>
               </div>
               <div class="panel-body">
                   <ul class="list-group">
                       <li class="list-group-item">金瓶没</li>
                       <li class="list-group-item">西游记</li>
                       <li class="list-group-item">洪流吗</li>

                   </ul>
               </div>
           </div>


       </div>
   </div>
</div>

</body>
</html>



 

2 个人头像显示

1 开启media
-配置文件
   MEDIA_ROOT=os.path.join(BASE_DIR,'media')
   -路由
    re_path('^media/(?P<path>.*?)$', serve,kwargs={'document_root':settings.MEDIA_ROOT}),
   -前端:
   <img class="media-object" src="media/{{ article.blog.userinfo.avatar }}" alt="..." height="60px" width="60px">
   

 

3 个人站点路由设计

1 路由一定要放在最后
   re_path('^(?P<username>\w+)$', views.personal_site),

 

4 个人站点页面设计

base.html

<!DOCTYPE html>
<html lang="en">
<head>
   <meta charset="UTF-8">
   <title>
      {% block title %}

      {% endblock %}
   </title>
   <link rel="stylesheet" href="/static/bootstrap-3.3.7-dist/css/bootstrap.min.css">
   <link rel="stylesheet" href="/static/font-awesome-4.7.0/css/font-awesome.min.css">
   <script src="/static/jquery-3.3.1.js"></script>
   <script src="/static/bootstrap-3.3.7-dist/js/bootstrap.min.js"></script>
  {% block js %}

  {% endblock %}
</head>
<body>

<div class="head" style="margin-bottom: 10px">

   <div style="height: 120px; color: rgb(152, 26, 26);">>
       <div class="row">
           <div class="col-md-2" style="font-size: 30px;color: white;margin: 20px">
              {% block site_name %}

              {% endblock %}
           </div>
       </div>
       <div class="row">
           <div class="pull-right" style="margin-right: 20px">
               <span><a href="">后台管理</a></span>
               <span>首页</span>
               <span>订阅</span>
           </div>
       </div>
   </div>
</div>
<div class="container-fluid">
   <div class="row">
      {% block left %}

      {% endblock %}
      {% block main %}

      {% endblock %}

   </div>
</div>

</body>
</html>

site.html

{% extends 'base.html' %}

{% block title %}
  {{ user.username }}-博客园
{% endblock %}

{% block site_name %}
  {{ user.blog.site_name }}
{% endblock %}

{% block left %}
   <div class="col-md-2">
       <div class="panel panel-success">
           <div class="panel-heading">
               <h3 class="panel-title">我的标签</h3>
           </div>
           <div class="panel-body">
              {% for tag in tag_list %}
                   <p><a href="">{{ tag.1 }}({{ tag.0 }})</a></p>
              {% endfor %}


           </div>
       </div>
       <div class="panel panel-info">
           <div class="panel-heading">
               <h3 class="panel-title">我的分类</h3>
           </div>
           <div class="panel-body">
              {% for category in category_list %}
                   <p><a href="">{{ category.name }}({{ category.count }})</a></p>
              {% endfor %}
           </div>
       </div>
       <div class="panel panel-info">
           <div class="panel-heading">
               <h3 class="panel-title">随笔档案</h3>
           </div>
           <div class="panel-body">
              {% for month in month_list %}

                   <p><a href="">{{ month.0|date:'Y年m月' }}({{ month.1 }})</a></p>
              {% endfor %}

           </div>
       </div>
   </div>
{% endblock %}

{% block main %}
   <div class="col-md-10">
       <div class="article" style="margin-top: 20px">
          {% for article in article_list %}
               <div>
                   <h4 class="media-heading"><a href="">{{ article.title }}</a></h4>
                   <div class="media">
                       <div class="media-body">
                          {{ article.desc }}

                       </div>
                       <div style="margin-top: 10px" class="pull-right">
                           <span class="article_footer">posted @</span>
                           <span class="article_footer">{{ article.create_time|date:'Y-m-d H:i:s' }}</span>
                          {#                               <span class="glyphicon glyphicon-thumbs-up article_footer">&nbsp;{{ article.up_num }}</span>#}
                           <span class="article_footer"><i
                                   class="fa fa-comment-o fa-lg"></i>&nbsp;{{ article.up_num }}</span>
                           <span class="article_footer"><i
                                   class="fa fa-home fa-lg"></i>&nbsp;{{ article.down_num }}</span>
                           <span class='article_footer'><i
                                   class="fa fa-frown-o fa-lg"></i>&nbsp;{{ article.commit_num }}</span>
                       </div>
                   </div>
                   <hr>
               </div>
          {% endfor %}


       </div>

   </div>
{% endblock %}

 

5 左侧过滤功能

# 查询当前站点下某年某月的文章数(分组依据,日期:年月),不需要连表
from django.db.models.functions import TruncMonth, TruncDay, TruncYear, TruncHour
'''
Sales.objects
.annotate(month=TruncMonth('timestamp')) # Truncate to month and add to select list
.values('month') # Group By month
.annotate(c=Count('id')) # Select the count of the grouping
.values('month', 'c') # (might be redundant, haven't tested) select month and count
'''


id   name         create_time        month
1    xx          2020-09-18:xxx      2020-09
2    xx44        2020-09-18:xxx      2020-09
   
3    xx44        2020-08-18:xxx      2020-08

 

from django.db.models import Count
def personal_site(request, username):
   user = models.UserInfo.objects.filter(username=username).first()
   if user:
       article_list = user.blog.article_set.all()
       # category_list = user.blog.category_set.all()
       # tag_list = user.blog.tag_set.all()
       # category_list=user.blog.category_set.all()

       # 查询每个分类下的文章数和分类名称
       # category_list=models.Category.objects.values('id').annotate(count=Count('article')).values('count','name')
       # print(category_list)

       # 查询当前这个站点下的分类及分类下的文章数
       category_list = models.Category.objects.filter(blog=user.blog).annotate(count=Count('article')).values('count', 'name')
       # category_list = models.Category.objects.filter(blog=user.blog).annotate(count=Count('article')).values_list('count', 'name')
       print(category_list)

       #查询当前站点下所有的标签及标签下的文章数

       # tag_list=models.Tag.objects.filter(blog=user.blog).annotate(count=Count('article')).values('count', 'name')
       tag_list=models.Tag.objects.filter(blog=user.blog).annotate(count=Count('article')).values_list('count', 'name')
       print(tag_list)

       # 查询当前站点下按月分组的文章数和年份月份
       '''
      Sales.objects
      .annotate(month=TruncMonth('timestamp')) # Truncate to month and add to select list
      .values('month') # Group By month
      .annotate(c=Count('id')) # Select the count of the grouping
      .values('month', 'c') # (might be redundant, haven't tested) select month and count
      '''
       from django.db.models.functions import TruncMonth,TruncYear  # 按月截断
       month_list=models.Article.objects.filter(blog=user.blog).annotate(month=TruncMonth('create_time')).values('month').annotate(count=Count('id')).values_list('month','count')
       print(month_list)
       return render(request, 'site.html', locals())
   else:
       return render(request, '404.html')

 

补充

1 图片防盗链
-通过referer限制
-在nginx上限制(代码不用限制)
-nginx不配置,代码中多加一层,中间件
posted @   DEJAVU_ERIC  阅读(86)  评论(0编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
点击右上角即可分享
微信分享提示