• 05 首页设计


    编辑本目录

    导航区域

    判断用户登录状态,根据登录状态显示不同的信息

    html代码

    <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>
            <li><a href="#">博文</a></li>
          </ul>
          <ul class="nav navbar-nav navbar-right">
              {% if request.user.is_authenticated %}
                    <li><a href="#" style="padding-right: 5px"><span id="user_icon" class="glyphicon glyphicon-user"></span></a></li>
                    <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 role="separator" class="divider"></li>
                        <li><a href="{% url 'logout' %}">注销</a></li>
                      </ul>
                    </li>
              {% else %}
                  <li><a href="{% url 'login' %}">登录</a></li>
                  <li><a href="{% url 'register' %}">注册</a></li>
              {% endif %}
          </ul>
        </div>
      </div>
    </nav>
    View Code

    Django默认admin添加数据

     django内部提供,后台数据管理组件

    创建超级用户:python manage.py createsuperuser

    admin组件注册应用:

    在项目的目录下存在一个admin.py的文件

    from django.contrib import admin
    from app import models
    # Register your models here.
    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.Atricle2Tag)
    admin.site.register(models.Comment)
    View Code

    注册后,在admin后台管理模块就能访问

     查询展示数据

     查询用户对应的博客数

    article_list=models.Article.objects.filter(user_id=user.nid)
    print("博客数:",article_list)
    View Code

    查询站点分类名称以及对应的文章数

    cate_list = models.Category.objects.filter(blog=blog).values('pk').annotate(c=Count('article__title')).values_list('title','c')
    print("站点博客对应的分类以及数量:",cate_list)
    View Code

    查询站点标签以及对应的文章数

    tag_list=models.Tag.objects.filter(blog=blog).values('pk').annotate(c=Count('article__title')).values_list('title','c')
    print("站点标签以及文章数:",tag_list)
    View Code

    查询站点年月名称以及文章数

    方式一:

    date_format

    extra()方法,不同的数据库格式不一样

    models.Article.objects.extra(select={"standard_time":"date_format(create_time,'%%Y-%%m-%%d')"}).values('title','standard_time')

     

    再对结果集进行分组,分组依据就是standard_time

    date_list=models.Article.objects.filter(user=user).extra(select={"d_t_time":"date_format(create_time,'%%Y-%%m-%%d')"}).values('d_t_time').annotate(c=Count('nid')).values('d_t_time','c')

     方式二:

    导入django工具

    from django.db.models.functions import TruncMonth

    用TruncMonth

    models.Article.objects.filter(user=user).annotate(month=TruncMonth('create_time')).values('month').annotate(c=Count('nid')).values_list('month','c')

    错误处理,需在setting.py中设置USE_TZ = False

     标签链接即分类展示

    view中添加添加判断,并用kwargs参数获取其余的参数

    def homesite(request,username,**kwargs):
        print(kwargs)
        user=UserInfo.objects.filter(username=username).first()
        #判断用户是否存在
        if not user:
            return render(request,'not_fount.html')
        #判断是否是跳转
        blog = user.blog
        if kwargs:
            condition=kwargs.get('condition')
            param=kwargs.get('param')
            if condition == 'category':
                article_list=models.Article.objects.filter(user=user).filter(category__title=param)
            elif condition == 'tag':
                article_list = models.Article.objects.filter(user=user).filter(tags__title=param)
            else:
                year,month=param.split('-')
                article_list = models.Article.objects.filter(user=user).filter(create_time__year=year,create_time__month=month)
        else:
            #个人站点相关查询
            #查询当前站点对象
            #当前用户或站点对应的所有文章
            #基于对象查询
            # article_list=user.atricle_set.all()
            #基于双下划线
            article_list=models.Article.objects.filter(user=user)
        #查询每一个分类名称及对应的文章数
        # ret=models.Category.objects.values('pk').annotate(c=Count('article__title')).values('title','c')
        # print(ret)
        #查询站点分类名称以及文章数
        # print(models.Category.objects.filter(blog=blog).annotate(c=Count('article__nid')).values('title','c'))
        cate_list =models.Category.objects.filter(blog=blog).annotate(c=Count('article__nid')).values_list('title','c')
        # print(cate_list)
        # print(models.Category.objects.filter(blog=blog).values('pk').annotate(c=Count('blog')).values('title','c'))
        #查询站点标签名称以及文章数
        tag_list=models.Tag.objects.filter(blog=blog).values('pk').annotate(c=Count('article__title')).values_list('title','c')
        #查询站点年月名称以及文章数
        date_list=models.Article.objects.filter(user=user).extra(select={"d_t_time":"date_format(create_time,'%%Y-%%m-%%d')"}).values('d_t_time').annotate(c=Count('nid')).values('d_t_time','c')
        #方式二
        date_list=models.Article.objects.filter(user=user).annotate(month=TruncMonth('create_time')).values('month').annotate(c=Count('nid')).values_list('month','c')
        return render(request,'homesite.html',{'username':username,'blog':blog,'article_list':article_list,'tag_list':tag_list,'cate_list':cate_list,'date_list':date_list})
    View Code

    urls中添加新的路由,用以获取站点下的连接

    re_path(r'^(?P<username>w+)/$',views.homesite),
    re_path(r'^(?P<username>w+)/(?P<condition>tag|category|archive)/(?P<param>.*)/$',views.homesite)
    View Code

    template模板中给标签,分类,归档添加链接a标签

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>homesite</title>
        <link rel="stylesheet" href="/static/app/css/homesite.css">
        <link rel="stylesheet" href="/static/css/bootstrap.min.css">
    </head>
    <body>
    <div class="header">
        <div class="contents">
            <p class="title">
                <span>{{ blog.title }}</span>
                <a href="" class="backend">管理</a>
            </p>
        </div>
    </div>
    <div class="container">
        <div class="row">
            <div class="col-md-3">
                <div class="panel panel-warning">
                    <div class="panel-heading">我的标签</div>
                    <div class="panel-body">
                        {% for tag in tag_list %}
                            <p><a href="/{{ username }}/tag/{{ tag.0 }}">{{ tag.0 }}({{ tag.1 }})</a></p>
                        {% endfor %}
                    </div>
                </div>
                <div class="panel panel-danger">
                        <div class="panel-heading">随笔分类</div>
                        <div class="panel-body">
                            {% for cate in cate_list %}
                                <p><a href="/{{ username }}/category/{{ cate.0 }}">{{ cate.0 }}({{ cate.1 }})</a></p>
                            {% endfor %}
                        </div>
                    </div>
                <div class="panel panel-danger">
                        <div class="panel-success">随笔归档</div>
                        <div class="panel-body">
                            {% for date in date_list %}
                                <p><a href="/{{ username }}/archive/{{ date.0 | date:'Y-m' }}">{{ date.0 | date:'Y-m' }}({{ date.1 }})</a></p>
                            {% endfor %}
                        </div>
                    </div>
            </div>
    
            <div class="col-md-9">
                <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-right">
                                {{ article.desc }}
                            </span>
                        </div>
                        <div class="small pub_info pull-right clearfix">
                            <span>发布于&nbsp;&nbsp;{{ article.create_time|date:"Y-m-d H:i" }}</span>&nbsp;&nbsp;
                            <span class="glyphicon glyphicon-comment"></span>
                            <span>评论({{ article.comment_count }})</span>&nbsp;&nbsp;
                            <span class="glyphicon glyphicon-thumbs-up"></span>
                            <span>点赞({{ article.up_count }})</span>
                        </div>
                        </div>
                        <hr/>
                    {% endfor %}
                </div>
            </div>
        </div>
    </div>
    </body>
    </html>
    View Code
  • 相关阅读:
    warning MSB3245: 未能解析此引用。未能找到程序集“CemeteryBLL”。请检查磁盘上是否存在该程序集。 如果您的代码需要此引用,则可能出现编译错误。
    C#MVC中创建多模块web应用程序
    Visual Studio提示“无法启动IIS Express Web服务器”的解决方法
    未能找到 CodeDom 提供程序类型“Microsoft.CodeDom.Providers.DotNetCompilerPlatform.CSharpCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=1.0.3.0, Culture=neutral, PublicKeyToken=31bf385
    WebHost failed to process a request.Memory gates checking failed because the free memory (140656640 bytes) is less than 5% of total memory
    wamp安装后打开默认网页显示dir,图标红点
    数字转为大写,钱转为大写格式
    SpringCloud
    Spring Boot
    双重校验锁 --使用volatile和两次判空校验
  • 原文地址:https://www.cnblogs.com/yaya625202/p/9375423.html
Copyright © 2020-2023  润新知