zoukankan      html  css  js  c++  java
  • python 全栈开发,Day80(博客系统分析,博客主页展示)

    一、博客系统分析

    数据库的构建

    首先,我们分析一个博客系统的功能:

    • 一个博客可以有多个标签(多对多)
    • 一个博客可以有多条评论(一对多)
    • 一个博客只可以有一个类别(多对一)

    接下来,我们分析关系的属性:
    博客:标题,作者,内容,发布时间,分类(外键),标签(多对多)等
    标签:标签名
    类别:分类名
    评论:作者,博客(外键),邮箱,内容,发布时间等。

    有8张表,表关系如下:

    图中箭头开始的英文字母表示关联字段

    按照箭头方向查询,表示正向查询,否则为反向查询

    新建项目cnblog,应用名为blog

    修改models.py,必须导入模块

    from django.contrib.auth.models import AbstractUser

    因为有一个表userinfo需要继承它。django自带的auth_user表也是继承AbstractUser

    表模型如下:

    from django.db import models
    

    # Create your models here.

    from django.db import models

    # Create your models here.

    from django.contrib.auth.models import AbstractUser

    class UserInfo(AbstractUser):
    """
    用户信息
    """
    nid
    = models.AutoField(primary_key=True)
    telephone
    = models.CharField(max_length=11, null=True, unique=True)
    avatar
    = models.FileField(upload_to='avatars/', default="avatars/default.png")
    create_time
    = models.DateTimeField(verbose_name='创建时间', auto_now_add=True)

    blog </span>= models.OneToOneField(to=<span style="color: #800000;">'</span><span style="color: #800000;">Blog</span><span style="color: #800000;">'</span>, to_field=<span style="color: #800000;">'</span><span style="color: #800000;">nid</span><span style="color: #800000;">'</span>, null=True, on_delete=<span style="color: #000000;">models.CASCADE)
    
    </span><span style="color: #0000ff;">def</span> <span style="color: #800080;">__str__</span><span style="color: #000000;">(self):
        </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> self.username
    

    class Blog(models.Model):
    """
    博客信息
    """
    nid
    = models.AutoField(primary_key=True)
    title
    = models.CharField(verbose_name='个人博客标题', max_length=64)
    site_name
    = models.CharField(verbose_name='站点名称', max_length=64)
    theme
    = models.CharField(verbose_name='博客主题', max_length=32)

    </span><span style="color: #0000ff;">def</span> <span style="color: #800080;">__str__</span><span style="color: #000000;">(self):
        </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> self.title
    

    class Category(models.Model):
    """
    博主个人文章分类表
    """
    nid
    = models.AutoField(primary_key=True)
    title
    = models.CharField(verbose_name='分类标题', max_length=32)
    blog
    = models.ForeignKey(verbose_name='所属博客', to='Blog', to_field='nid', on_delete=models.CASCADE)

    </span><span style="color: #0000ff;">def</span> <span style="color: #800080;">__str__</span><span style="color: #000000;">(self):
        </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> self.title
    

    class Tag(models.Model):
    nid
    = models.AutoField(primary_key=True)
    title
    = models.CharField(verbose_name='标签名称', max_length=32)
    blog
    = models.ForeignKey(verbose_name='所属博客', to='Blog', to_field='nid', on_delete=models.CASCADE)

    </span><span style="color: #0000ff;">def</span> <span style="color: #800080;">__str__</span><span style="color: #000000;">(self):
        </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> self.title
    

    class Article(models.Model):

    nid </span>= models.AutoField(primary_key=<span style="color: #000000;">True)
    title </span>= models.CharField(max_length=50, verbose_name=<span style="color: #800000;">'</span><span style="color: #800000;">文章标题</span><span style="color: #800000;">'</span><span style="color: #000000;">)
    desc </span>= models.CharField(max_length=255, verbose_name=<span style="color: #800000;">'</span><span style="color: #800000;">文章描述</span><span style="color: #800000;">'</span><span style="color: #000000;">)
    create_time </span>= models.DateTimeField(verbose_name=<span style="color: #800000;">'</span><span style="color: #800000;">创建时间</span><span style="color: #800000;">'</span>, auto_now_add=<span style="color: #000000;">True)
    content </span>=<span style="color: #000000;"> models.TextField()
    
    comment_count </span>= models.IntegerField(default=<span style="color: #000000;">0)
    up_count </span>= models.IntegerField(default=<span style="color: #000000;">0)
    down_count </span>= models.IntegerField(default=<span style="color: #000000;">0)
    
    user </span>= models.ForeignKey(verbose_name=<span style="color: #800000;">'</span><span style="color: #800000;">作者</span><span style="color: #800000;">'</span>, to=<span style="color: #800000;">'</span><span style="color: #800000;">UserInfo</span><span style="color: #800000;">'</span>, to_field=<span style="color: #800000;">'</span><span style="color: #800000;">nid</span><span style="color: #800000;">'</span>, on_delete=<span style="color: #000000;">models.CASCADE)
    category </span>= models.ForeignKey(to=<span style="color: #800000;">'</span><span style="color: #800000;">Category</span><span style="color: #800000;">'</span>, to_field=<span style="color: #800000;">'</span><span style="color: #800000;">nid</span><span style="color: #800000;">'</span>, null=True, on_delete=<span style="color: #000000;">models.CASCADE)
    tags </span>=<span style="color: #000000;"> models.ManyToManyField(
        to</span>=<span style="color: #800000;">"</span><span style="color: #800000;">Tag</span><span style="color: #800000;">"</span><span style="color: #000000;">,
        </span><span style="color: #008000;">#</span><span style="color: #008000;">through参数可以指定用作中介的中间模型</span>
        through=<span style="color: #800000;">'</span><span style="color: #800000;">Article2Tag</span><span style="color: #800000;">'</span><span style="color: #000000;">,
    )
    
    </span><span style="color: #0000ff;">def</span> <span style="color: #800080;">__str__</span><span style="color: #000000;">(self):
        </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> self.title
    

    class Article2Tag(models.Model):
    nid
    = models.AutoField(primary_key=True)
    article
    = models.ForeignKey(verbose_name='文章', to="Article", to_field='nid', on_delete=models.CASCADE)
    tag
    = models.ForeignKey(verbose_name='标签', to="Tag", to_field='nid', on_delete=models.CASCADE)

    </span><span style="color: #0000ff;">class</span><span style="color: #000000;"> Meta:
        </span><span style="color: #008000;">#</span><span style="color: #008000;">组合唯一约束</span>
        unique_together =<span style="color: #000000;"> [
            (</span><span style="color: #800000;">'</span><span style="color: #800000;">article</span><span style="color: #800000;">'</span>, <span style="color: #800000;">'</span><span style="color: #800000;">tag</span><span style="color: #800000;">'</span><span style="color: #000000;">),
        ]
    
    </span><span style="color: #0000ff;">def</span> <span style="color: #800080;">__str__</span><span style="color: #000000;">(self):
        v </span>= self.article.title + <span style="color: #800000;">"</span><span style="color: #800000;">---</span><span style="color: #800000;">"</span> +<span style="color: #000000;"> self.tag.title
        </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> v
    

    class ArticleUpDown(models.Model):
    """
    点赞表
    """

    nid </span>= models.AutoField(primary_key=<span style="color: #000000;">True)
    user </span>= models.ForeignKey(<span style="color: #800000;">'</span><span style="color: #800000;">UserInfo</span><span style="color: #800000;">'</span>, null=True, on_delete=<span style="color: #000000;">models.CASCADE)
    article </span>= models.ForeignKey(<span style="color: #800000;">"</span><span style="color: #800000;">Article</span><span style="color: #800000;">"</span>, null=True, on_delete=<span style="color: #000000;">models.CASCADE)
    is_up </span>= models.BooleanField(default=<span style="color: #000000;">True)
    
    </span><span style="color: #0000ff;">class</span><span style="color: #000000;"> Meta:
        </span><span style="color: #008000;">#</span><span style="color: #008000;"> 组合唯一约束</span>
        unique_together =<span style="color: #000000;"> [
            (</span><span style="color: #800000;">'</span><span style="color: #800000;">article</span><span style="color: #800000;">'</span>, <span style="color: #800000;">'</span><span style="color: #800000;">user</span><span style="color: #800000;">'</span><span style="color: #000000;">),
        ]
    

    class Comment(models.Model):
    """

    评论表
    
    </span><span style="color: #800000;">"""</span><span style="color: #000000;">
    nid </span>= models.AutoField(primary_key=<span style="color: #000000;">True)
    article </span>= models.ForeignKey(verbose_name=<span style="color: #800000;">'</span><span style="color: #800000;">评论文章</span><span style="color: #800000;">'</span>, to=<span style="color: #800000;">'</span><span style="color: #800000;">Article</span><span style="color: #800000;">'</span>, to_field=<span style="color: #800000;">'</span><span style="color: #800000;">nid</span><span style="color: #800000;">'</span>, on_delete=<span style="color: #000000;">models.CASCADE)
    user </span>= models.ForeignKey(verbose_name=<span style="color: #800000;">'</span><span style="color: #800000;">评论者</span><span style="color: #800000;">'</span>, to=<span style="color: #800000;">'</span><span style="color: #800000;">UserInfo</span><span style="color: #800000;">'</span>, to_field=<span style="color: #800000;">'</span><span style="color: #800000;">nid</span><span style="color: #800000;">'</span>, on_delete=<span style="color: #000000;">models.CASCADE)
    content </span>= models.CharField(verbose_name=<span style="color: #800000;">'</span><span style="color: #800000;">评论内容</span><span style="color: #800000;">'</span>, max_length=255<span style="color: #000000;">)
    create_time </span>= models.DateTimeField(verbose_name=<span style="color: #800000;">'</span><span style="color: #800000;">创建时间</span><span style="color: #800000;">'</span>, auto_now_add=<span style="color: #000000;">True)
    parent_comment </span>= models.ForeignKey(<span style="color: #800000;">'</span><span style="color: #800000;">Comment</span><span style="color: #800000;">'</span>, null=True, on_delete=<span style="color: #000000;">models.CASCADE)
    
    </span><span style="color: #0000ff;">def</span> <span style="color: #800080;">__str__</span><span style="color: #000000;">(self):
        </span><span style="color: #0000ff;">return</span> self.content</pre>
    
    View Code

    相关参数解释:

    through 表示orm,不要创建关系表。而制定一个表,这个表自己来创建!为什么呢?因为orm创建多对多关系表时,只有3个字段。那么需要关系表需要扩充字段时,就不行了!

    所以设置through 字段,是为了方便添加额外的字段。使用through,那么这个表,称之为中间模型。

    在Comment模型表中,有一个字段parent_comment。它关联的是本身表中的主键nid,它是一个父级评论id,用来展示谁评论谁!to='Comment'等同于to='self'

    修改settings.py配置文件,覆盖默认的User模型最后一行添加,否则执行创建表命令时会报错!

    AUTH_USER_MODEL="blog.UserInfo"

    Django允许你通过修改setting.py文件中的 AUTH_USER_MODEL 设置覆盖默认的User模型,其值引用一个自定义的模型。

    bolg,是应用名。

    使用下面2个命令,生成表

    python manage.py makemigrations
    python manage.py migrate

    生成的表如下:

     注意:django自带的auth_user表没有了,取而代之的是blog_userinfo表。

    查看表字段

    它在auth_user表的基础上,增加了5个字段!

    登录验证

    添加超级用户,密码必须是8位或者以上!

    python manage.py createsuperuser

    效果如下:

    再创建2个用户,zhang和lisi。用来测试多个用户登录! 

    lisi用户

    修改urls.py,增加路径

    from blog import views
    urlpatterns = [
        path('admin/', admin.site.urls),
        path('index/', views.index),
        path('login/', views.login),
    ]
    View Code

    修改views.py,增加视图函数

    from django.shortcuts import render,HttpResponse,redirect
    from django.contrib import auth
    from blog.models import Article,UserInfo
    

    # Create your views here.
    def login(request):

    </span><span style="color: #0000ff;">if</span> request.method==<span style="color: #800000;">"</span><span style="color: #800000;">POST</span><span style="color: #800000;">"</span><span style="color: #000000;">:
        user</span>=request.POST.get(<span style="color: #800000;">"</span><span style="color: #800000;">user</span><span style="color: #800000;">"</span><span style="color: #000000;">)
        pwd</span>=request.POST.get(<span style="color: #800000;">"</span><span style="color: #800000;">pwd</span><span style="color: #800000;">"</span><span style="color: #000000;">)
        </span><span style="color: #008000;">#</span><span style="color: #008000;"> 用户验证成功,返回user对象,否则返回None</span>
        user=auth.authenticate(username=user,password=<span style="color: #000000;">pwd)
        </span><span style="color: #0000ff;">if</span><span style="color: #000000;"> user:
            </span><span style="color: #008000;">#</span><span style="color: #008000;"> 登录,注册session</span>
            <span style="color: #008000;">#</span><span style="color: #008000;"> 全局变量 request.user=当前登陆对象(session中)</span>
    

    auth.login(request,user)
    return redirect("/index/")

    </span><span style="color: #0000ff;">return</span> render(request,<span style="color: #800000;">"</span><span style="color: #800000;">login.html</span><span style="color: #800000;">"</span><span style="color: #000000;">)
    

    def index(request):
    return render(request,"index.html")

    View Code

    修改login.html

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
    <form action="" method="post">
        {% csrf_token %}
        <lable>用户名</lable><input type="text" name="user">
        <lable>密码</lable><input type="password" name="pwd">
        <input type="submit">
    </form>
    </body>
    </html>
    View Code

    修改index.html

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
    <h3>INDEX</h3>
    </body>
    </html>
    View Code

    访问登录页面

    跳转到首页

    首页修饰

    修改settings.py,设置静态文件目录。最后一行添加:

    STATICFILES_DIRS=[
        os.path.join(BASE_DIR,"static")
    ]
    View Code

    下载bootsrtap,将压缩的包内容放到satic目录

    img和js是新建的

    目录如下:

    修改urls.py,增加路径

    urlpatterns = [
        path('admin/', admin.site.urls),
        path('login/', views.login),
        path('index/', views.index),
        path('logout/', views.logout),
        path('', views.index),
    ]
    View Code

    修改views.py,增加注销

    def logout(request):  # 注销
        auth.logout(request)
        return redirect("/index/")
    View Code

    修改index.html

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        <link rel="stylesheet" href="/static/bootstrap/css/bootstrap.css">
        <script src="/static/js/jquery.js"></script>
        <script src="/static/bootstrap/js/bootstrap.js"></script>
        <style>
            .desc{
                text-align: justify;
            }
    
        .info{
            margin</span>-<span style="color: #000000;">top: 10px;
        }
    
    </span>&lt;/style&gt;
    

    </head>
    <body>
    <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>

        &lt;!-- Collect the nav links, forms, <span style="color: #0000ff;">and</span> other content <span style="color: #0000ff;">for</span> toggling --&gt;
        &lt;div <span style="color: #0000ff;">class</span>=<span style="color: #800000;">"</span><span style="color: #800000;">collapse navbar-collapse</span><span style="color: #800000;">"</span> id=<span style="color: #800000;">"</span><span style="color: #800000;">bs-example-navbar-collapse-1</span><span style="color: #800000;">"</span>&gt;
            &lt;ul <span style="color: #0000ff;">class</span>=<span style="color: #800000;">"</span><span style="color: #800000;">nav navbar-nav</span><span style="color: #800000;">"</span>&gt;
                &lt;li <span style="color: #0000ff;">class</span>=<span style="color: #800000;">"</span><span style="color: #800000;">active</span><span style="color: #800000;">"</span>&gt;&lt;a href=<span style="color: #800000;">"</span><span style="color: #800000;">#</span><span style="color: #800000;">"</span>&gt;新闻 &lt;span <span style="color: #0000ff;">class</span>=<span style="color: #800000;">"</span><span style="color: #800000;">sr-only</span><span style="color: #800000;">"</span>&gt;(current)&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;
                &lt;li&gt;&lt;a href=<span style="color: #800000;">"</span><span style="color: #800000;">#</span><span style="color: #800000;">"</span>&gt;博问&lt;/a&gt;&lt;/li&gt;
    
            &lt;/ul&gt;
    
            &lt;ul <span style="color: #0000ff;">class</span>=<span style="color: #800000;">"</span><span style="color: #800000;">nav navbar-nav navbar-right</span><span style="color: #800000;">"</span>&gt;<span style="color: #000000;">
                {</span>% <span style="color: #0000ff;">if</span> request.user.username %<span style="color: #000000;">}
                    </span>&lt;li&gt;&lt;a href=<span style="color: #800000;">"</span><span style="color: #800000;">#</span><span style="color: #800000;">"</span>&gt;&lt;span <span style="color: #0000ff;">class</span>=<span style="color: #800000;">"</span><span style="color: #800000;">glyphicon glyphicon-user</span><span style="color: #800000;">"</span>&gt;&lt;/span&gt;&amp;nbsp;{{ request.user.username }}&lt;/a&gt;
                    &lt;/li&gt;
                    &lt;li <span style="color: #0000ff;">class</span>=<span style="color: #800000;">"</span><span style="color: #800000;">dropdown</span><span style="color: #800000;">"</span>&gt;
                        &lt;a href=<span style="color: #800000;">"</span><span style="color: #800000;">#</span><span style="color: #800000;">"</span> <span style="color: #0000ff;">class</span>=<span style="color: #800000;">"</span><span style="color: #800000;">dropdown-toggle</span><span style="color: #800000;">"</span> data-toggle=<span style="color: #800000;">"</span><span style="color: #800000;">dropdown</span><span style="color: #800000;">"</span> role=<span style="color: #800000;">"</span><span style="color: #800000;">button</span><span style="color: #800000;">"</span> aria-haspopup=<span style="color: #800000;">"</span><span style="color: #800000;">true</span><span style="color: #800000;">"</span><span style="color: #000000;">
                           aria</span>-expanded=<span style="color: #800000;">"</span><span style="color: #800000;">false</span><span style="color: #800000;">"</span>&gt;Dropdown &lt;span <span style="color: #0000ff;">class</span>=<span style="color: #800000;">"</span><span style="color: #800000;">caret</span><span style="color: #800000;">"</span>&gt;&lt;/span&gt;&lt;/a&gt;
                        &lt;ul <span style="color: #0000ff;">class</span>=<span style="color: #800000;">"</span><span style="color: #800000;">dropdown-menu</span><span style="color: #800000;">"</span>&gt;
                            &lt;li&gt;&lt;a href=<span style="color: #800000;">"</span><span style="color: #800000;">#</span><span style="color: #800000;">"</span>&gt;修改密码&lt;/a&gt;&lt;/li&gt;
                            &lt;li&gt;&lt;a href=<span style="color: #800000;">"</span><span style="color: #800000;">#</span><span style="color: #800000;">"</span>&gt;个人信息&lt;/a&gt;&lt;/li&gt;
                            &lt;li&gt;&lt;a href=<span style="color: #800000;">"</span><span style="color: #800000;">/logout/</span><span style="color: #800000;">"</span>&gt;注销&lt;/a&gt;&lt;/li&gt;
                            &lt;li role=<span style="color: #800000;">"</span><span style="color: #800000;">separator</span><span style="color: #800000;">"</span> <span style="color: #0000ff;">class</span>=<span style="color: #800000;">"</span><span style="color: #800000;">divider</span><span style="color: #800000;">"</span>&gt;&lt;/li&gt;
                            &lt;li&gt;&lt;a href=<span style="color: #800000;">"</span><span style="color: #800000;">#</span><span style="color: #800000;">"</span>&gt;Separated link&lt;/a&gt;&lt;/li&gt;
                        &lt;/ul&gt;
                    &lt;/li&gt;<span style="color: #000000;">
    
                {</span>% <span style="color: #0000ff;">else</span> %<span style="color: #000000;">}
                    </span>&lt;li&gt;&lt;a href=<span style="color: #800000;">"</span><span style="color: #800000;">/login/</span><span style="color: #800000;">"</span>&gt;登陆&lt;/a&gt;&lt;/li&gt;
                    &lt;li&gt;&lt;a href=<span style="color: #800000;">"</span><span style="color: #800000;">#</span><span style="color: #800000;">"</span>&gt;注册&lt;/a&gt;&lt;/li&gt;<span style="color: #000000;">
                {</span>% endif %<span style="color: #000000;">}
    
    
            </span>&lt;/ul&gt;
        &lt;/div&gt;&lt;!-- /.navbar-collapse --&gt;
    &lt;/div&gt;&lt;!-- /.container-fluid --&gt;
    

    </nav>

    <div class="container-fluid">
    <div class="row">
    <div class="col-md-3">
    <div class="panel panel-primary">
    <div class="panel-heading">
    <h3 class="panel-title">Panel title</h3>
    </div>
    <div class="panel-body">
    Panel content
    </div>
    </div>

            &lt;div <span style="color: #0000ff;">class</span>=<span style="color: #800000;">"</span><span style="color: #800000;">panel panel-danger</span><span style="color: #800000;">"</span>&gt;
                &lt;div <span style="color: #0000ff;">class</span>=<span style="color: #800000;">"</span><span style="color: #800000;">panel-heading</span><span style="color: #800000;">"</span>&gt;
                    &lt;h3 <span style="color: #0000ff;">class</span>=<span style="color: #800000;">"</span><span style="color: #800000;">panel-title</span><span style="color: #800000;">"</span>&gt;Panel title&lt;/h3&gt;
                &lt;/div&gt;
                &lt;div <span style="color: #0000ff;">class</span>=<span style="color: #800000;">"</span><span style="color: #800000;">panel-body</span><span style="color: #800000;">"</span>&gt;<span style="color: #000000;">
                    Panel content
                </span>&lt;/div&gt;
            &lt;/div&gt;
        &lt;/div&gt;
        &lt;div <span style="color: #0000ff;">class</span>=<span style="color: #800000;">"</span><span style="color: #800000;">col-md-6</span><span style="color: #800000;">"</span>&gt;
    
            222
    
        &lt;/div&gt;
        &lt;div <span style="color: #0000ff;">class</span>=<span style="color: #800000;">"</span><span style="color: #800000;">col-md-3</span><span style="color: #800000;">"</span>&gt;
    
            &lt;div <span style="color: #0000ff;">class</span>=<span style="color: #800000;">"</span><span style="color: #800000;">panel panel-warning</span><span style="color: #800000;">"</span>&gt;
                &lt;div <span style="color: #0000ff;">class</span>=<span style="color: #800000;">"</span><span style="color: #800000;">panel-heading</span><span style="color: #800000;">"</span>&gt;
                    &lt;h3 <span style="color: #0000ff;">class</span>=<span style="color: #800000;">"</span><span style="color: #800000;">panel-title</span><span style="color: #800000;">"</span>&gt;Panel title&lt;/h3&gt;
                &lt;/div&gt;
                &lt;div <span style="color: #0000ff;">class</span>=<span style="color: #800000;">"</span><span style="color: #800000;">panel-body</span><span style="color: #800000;">"</span>&gt;<span style="color: #000000;">
                    Panel content
                </span>&lt;/div&gt;
            &lt;/div&gt;
            &lt;div <span style="color: #0000ff;">class</span>=<span style="color: #800000;">"</span><span style="color: #800000;">panel panel-info</span><span style="color: #800000;">"</span>&gt;
                &lt;div <span style="color: #0000ff;">class</span>=<span style="color: #800000;">"</span><span style="color: #800000;">panel-heading</span><span style="color: #800000;">"</span>&gt;
                    &lt;h3 <span style="color: #0000ff;">class</span>=<span style="color: #800000;">"</span><span style="color: #800000;">panel-title</span><span style="color: #800000;">"</span>&gt;Panel title&lt;/h3&gt;
                &lt;/div&gt;
                &lt;div <span style="color: #0000ff;">class</span>=<span style="color: #800000;">"</span><span style="color: #800000;">panel-body</span><span style="color: #800000;">"</span>&gt;<span style="color: #000000;">
                    Panel content
                </span>&lt;/div&gt;
            &lt;/div&gt;
            &lt;div <span style="color: #0000ff;">class</span>=<span style="color: #800000;">"</span><span style="color: #800000;">panel panel-success</span><span style="color: #800000;">"</span>&gt;
                &lt;div <span style="color: #0000ff;">class</span>=<span style="color: #800000;">"</span><span style="color: #800000;">panel-heading</span><span style="color: #800000;">"</span>&gt;
                    &lt;h3 <span style="color: #0000ff;">class</span>=<span style="color: #800000;">"</span><span style="color: #800000;">panel-title</span><span style="color: #800000;">"</span>&gt;Panel title&lt;/h3&gt;
                &lt;/div&gt;
                &lt;div <span style="color: #0000ff;">class</span>=<span style="color: #800000;">"</span><span style="color: #800000;">panel-body</span><span style="color: #800000;">"</span>&gt;<span style="color: #000000;">
                    Panel content
                </span>&lt;/div&gt;
            &lt;/div&gt;
    
        &lt;/div&gt;
    &lt;/div&gt;
    

    </div>

    </body>
    </html>

    View Code

    重新登录,效果如下:

    添加内容

     使用django自带的admin后台,快速添加数据。

    访问后台页面,这里必须是超级用户。上面已经创建了超级用户xiao

    默认是空的

    操作表,必须要注册

    修改views.py同级目录下的admin.py

    注册所有的模型表

    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.Article2Tag)
    admin.site.register(models.Article)
    admin.site.register(models.ArticleUpDown)
    admin.site.register(models.Comment)

    View Code

    再次刷新页面

     

    点击Articles,添加文章

     

    从http://www.py3study.com 上面copy一篇博客

    注意内容都是html代码

     添加分类

     添加站点

     保存

    点击保存

     添加成功

    多添加几篇博客

    首页文章展示

    修改settings.py,更改时区

    TIME_ZONE = 'Asia/Shanghai'

    修改index视图函数

    def index(request):
        article_list=Article.objects.all()
        return render(request,"index.html",{"article_list":article_list})
    View Code

    修改index.html

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        <link rel="stylesheet" href="/static/bootstrap/css/bootstrap.css">
        <script src="/static/js/jquery.js"></script>
        <script src="/static/bootstrap/js/bootstrap.js"></script>
        <style>
            .desc{
                text-align: justify;
            }
    
        .info{
            margin</span>-<span style="color: #000000;">top: 10px;
        }
    
    </span>&lt;/style&gt;
    

    </head>
    <body>
    <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>

        &lt;!-- Collect the nav links, forms, <span style="color: #0000ff;">and</span> other content <span style="color: #0000ff;">for</span> toggling --&gt;
        &lt;div <span style="color: #0000ff;">class</span>=<span style="color: #800000;">"</span><span style="color: #800000;">collapse navbar-collapse</span><span style="color: #800000;">"</span> id=<span style="color: #800000;">"</span><span style="color: #800000;">bs-example-navbar-collapse-1</span><span style="color: #800000;">"</span>&gt;
            &lt;ul <span style="color: #0000ff;">class</span>=<span style="color: #800000;">"</span><span style="color: #800000;">nav navbar-nav</span><span style="color: #800000;">"</span>&gt;
                &lt;li <span style="color: #0000ff;">class</span>=<span style="color: #800000;">"</span><span style="color: #800000;">active</span><span style="color: #800000;">"</span>&gt;&lt;a href=<span style="color: #800000;">"</span><span style="color: #800000;">#</span><span style="color: #800000;">"</span>&gt;新闻 &lt;span <span style="color: #0000ff;">class</span>=<span style="color: #800000;">"</span><span style="color: #800000;">sr-only</span><span style="color: #800000;">"</span>&gt;(current)&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;
                &lt;li&gt;&lt;a href=<span style="color: #800000;">"</span><span style="color: #800000;">#</span><span style="color: #800000;">"</span>&gt;博问&lt;/a&gt;&lt;/li&gt;
    
            &lt;/ul&gt;
    
            &lt;ul <span style="color: #0000ff;">class</span>=<span style="color: #800000;">"</span><span style="color: #800000;">nav navbar-nav navbar-right</span><span style="color: #800000;">"</span>&gt;<span style="color: #000000;">
                {</span>% <span style="color: #0000ff;">if</span> request.user.username %<span style="color: #000000;">}
                    </span>&lt;li&gt;&lt;a href=<span style="color: #800000;">"</span><span style="color: #800000;">#</span><span style="color: #800000;">"</span>&gt;&lt;span <span style="color: #0000ff;">class</span>=<span style="color: #800000;">"</span><span style="color: #800000;">glyphicon glyphicon-user</span><span style="color: #800000;">"</span>&gt;&lt;/span&gt;&amp;nbsp;{{ request.user.username }}&lt;/a&gt;
                    &lt;/li&gt;
                    &lt;li <span style="color: #0000ff;">class</span>=<span style="color: #800000;">"</span><span style="color: #800000;">dropdown</span><span style="color: #800000;">"</span>&gt;
                        &lt;a href=<span style="color: #800000;">"</span><span style="color: #800000;">#</span><span style="color: #800000;">"</span> <span style="color: #0000ff;">class</span>=<span style="color: #800000;">"</span><span style="color: #800000;">dropdown-toggle</span><span style="color: #800000;">"</span> data-toggle=<span style="color: #800000;">"</span><span style="color: #800000;">dropdown</span><span style="color: #800000;">"</span> role=<span style="color: #800000;">"</span><span style="color: #800000;">button</span><span style="color: #800000;">"</span> aria-haspopup=<span style="color: #800000;">"</span><span style="color: #800000;">true</span><span style="color: #800000;">"</span><span style="color: #000000;">
                           aria</span>-expanded=<span style="color: #800000;">"</span><span style="color: #800000;">false</span><span style="color: #800000;">"</span>&gt;Dropdown &lt;span <span style="color: #0000ff;">class</span>=<span style="color: #800000;">"</span><span style="color: #800000;">caret</span><span style="color: #800000;">"</span>&gt;&lt;/span&gt;&lt;/a&gt;
                        &lt;ul <span style="color: #0000ff;">class</span>=<span style="color: #800000;">"</span><span style="color: #800000;">dropdown-menu</span><span style="color: #800000;">"</span>&gt;
                            &lt;li&gt;&lt;a href=<span style="color: #800000;">"</span><span style="color: #800000;">#</span><span style="color: #800000;">"</span>&gt;修改密码&lt;/a&gt;&lt;/li&gt;
                            &lt;li&gt;&lt;a href=<span style="color: #800000;">"</span><span style="color: #800000;">#</span><span style="color: #800000;">"</span>&gt;个人信息&lt;/a&gt;&lt;/li&gt;
                            &lt;li&gt;&lt;a href=<span style="color: #800000;">"</span><span style="color: #800000;">/logout/</span><span style="color: #800000;">"</span>&gt;注销&lt;/a&gt;&lt;/li&gt;
                            &lt;li role=<span style="color: #800000;">"</span><span style="color: #800000;">separator</span><span style="color: #800000;">"</span> <span style="color: #0000ff;">class</span>=<span style="color: #800000;">"</span><span style="color: #800000;">divider</span><span style="color: #800000;">"</span>&gt;&lt;/li&gt;
                            &lt;li&gt;&lt;a href=<span style="color: #800000;">"</span><span style="color: #800000;">#</span><span style="color: #800000;">"</span>&gt;Separated link&lt;/a&gt;&lt;/li&gt;
                        &lt;/ul&gt;
                    &lt;/li&gt;<span style="color: #000000;">
    
                {</span>% <span style="color: #0000ff;">else</span> %<span style="color: #000000;">}
                    </span>&lt;li&gt;&lt;a href=<span style="color: #800000;">"</span><span style="color: #800000;">/login/</span><span style="color: #800000;">"</span>&gt;登陆&lt;/a&gt;&lt;/li&gt;
                    &lt;li&gt;&lt;a href=<span style="color: #800000;">"</span><span style="color: #800000;">#</span><span style="color: #800000;">"</span>&gt;注册&lt;/a&gt;&lt;/li&gt;<span style="color: #000000;">
                {</span>% endif %<span style="color: #000000;">}
    
    
            </span>&lt;/ul&gt;
        &lt;/div&gt;&lt;!-- /.navbar-collapse --&gt;
    &lt;/div&gt;&lt;!-- /.container-fluid --&gt;
    

    </nav>

    <div class="container-fluid">
    <div class="row">
    <div class="col-md-3">
    <div class="panel panel-primary">
    <div class="panel-heading">
    <h3 class="panel-title">Panel title</h3>
    </div>
    <div class="panel-body">
    Panel content
    </div>
    </div>

            &lt;div <span style="color: #0000ff;">class</span>=<span style="color: #800000;">"</span><span style="color: #800000;">panel panel-danger</span><span style="color: #800000;">"</span>&gt;
                &lt;div <span style="color: #0000ff;">class</span>=<span style="color: #800000;">"</span><span style="color: #800000;">panel-heading</span><span style="color: #800000;">"</span>&gt;
                    &lt;h3 <span style="color: #0000ff;">class</span>=<span style="color: #800000;">"</span><span style="color: #800000;">panel-title</span><span style="color: #800000;">"</span>&gt;Panel title&lt;/h3&gt;
                &lt;/div&gt;
                &lt;div <span style="color: #0000ff;">class</span>=<span style="color: #800000;">"</span><span style="color: #800000;">panel-body</span><span style="color: #800000;">"</span>&gt;<span style="color: #000000;">
                    Panel content
                </span>&lt;/div&gt;
            &lt;/div&gt;
        &lt;/div&gt;
        &lt;div <span style="color: #0000ff;">class</span>=<span style="color: #800000;">"</span><span style="color: #800000;">col-md-6</span><span style="color: #800000;">"</span>&gt;
    
            &lt;div <span style="color: #0000ff;">class</span>=<span style="color: #800000;">"</span><span style="color: #800000;">article_list</span><span style="color: #800000;">"</span>&gt;<span style="color: #000000;">
                {</span>% <span style="color: #0000ff;">for</span> article <span style="color: #0000ff;">in</span> article_list %<span style="color: #000000;">}
                 </span>&lt;div <span style="color: #0000ff;">class</span>=<span style="color: #800000;">"</span><span style="color: #800000;">article_item</span><span style="color: #800000;">"</span>&gt;
                      &lt;h5&gt;&lt;a href=<span style="color: #800000;">""</span>&gt;{{ article.title }}&lt;/a&gt;&lt;/h5&gt;
                      &lt;div&gt;
                          &lt;span <span style="color: #0000ff;">class</span>=<span style="color: #800000;">"</span><span style="color: #800000;">media-left</span><span style="color: #800000;">"</span>&gt;&lt;a href=<span style="color: #800000;">""</span>&gt;&lt;img width=<span style="color: #800000;">"</span><span style="color: #800000;">60</span><span style="color: #800000;">"</span> height=<span style="color: #800000;">"</span><span style="color: #800000;">60</span><span style="color: #800000;">"</span> src=<span style="color: #800000;">"</span><span style="color: #800000;">https://ss0.baidu.com/6ONWsjip0QIZ8tyhnq/it/u=1758343206,1224786249&amp;fm=58&amp;bpow=1024&amp;bpoh=1536</span><span style="color: #800000;">"</span> alt=<span style="color: #800000;">""</span>&gt;&lt;/a&gt;&lt;/span&gt;
    
                          &lt;span <span style="color: #0000ff;">class</span>=<span style="color: #800000;">"</span><span style="color: #800000;">media-right small desc </span><span style="color: #800000;">"</span>&gt;<span style="color: #000000;">
                              {{ article.desc }}
                          </span>&lt;/span&gt;
    
                      &lt;/div&gt;
                      &lt;div <span style="color: #0000ff;">class</span>=<span style="color: #800000;">"</span><span style="color: #800000;">info small</span><span style="color: #800000;">"</span>&gt;
                            &lt;span&gt;&lt;a href=<span style="color: #800000;">""</span>&gt;{{ article.user.username }}&lt;/a&gt;&lt;/span&gt; &amp;<span style="color: #000000;">nbsp;
                            发布于 </span>&lt;span&gt;{{ article.create_time|date:<span style="color: #800000;">'</span><span style="color: #800000;">Y-m-d H:i</span><span style="color: #800000;">'</span> }}&lt;/span&gt;&amp;nbsp;&amp;<span style="color: #000000;">nbsp;
                           </span>&lt;span <span style="color: #0000ff;">class</span>=<span style="color: #800000;">"</span><span style="color: #800000;">glyphicon glyphicon-comment</span><span style="color: #800000;">"</span>&gt;&lt;/span&gt;&lt;a href=<span style="color: #800000;">""</span>&gt;评论({{ article.comment_count }})&lt;/a&gt;&amp;nbsp;&amp;<span style="color: #000000;">nbsp;
                           </span>&lt;span <span style="color: #0000ff;">class</span>=<span style="color: #800000;">"</span><span style="color: #800000;">glyphicon glyphicon-thumbs-up</span><span style="color: #800000;">"</span>&gt;&lt;/span&gt;&lt;a href=<span style="color: #800000;">""</span>&gt;点赞({{ article.up_count }})&lt;/a&gt;
                      &lt;/div&gt;
                 &lt;/div&gt;
                    &lt;hr&gt;<span style="color: #000000;">
                {</span>% endfor %<span style="color: #000000;">}
            </span>&lt;/div&gt;
    
    
    
        &lt;/div&gt;
        &lt;div <span style="color: #0000ff;">class</span>=<span style="color: #800000;">"</span><span style="color: #800000;">col-md-3</span><span style="color: #800000;">"</span>&gt;
    
            &lt;div <span style="color: #0000ff;">class</span>=<span style="color: #800000;">"</span><span style="color: #800000;">panel panel-warning</span><span style="color: #800000;">"</span>&gt;
                &lt;div <span style="color: #0000ff;">class</span>=<span style="color: #800000;">"</span><span style="color: #800000;">panel-heading</span><span style="color: #800000;">"</span>&gt;
                    &lt;h3 <span style="color: #0000ff;">class</span>=<span style="color: #800000;">"</span><span style="color: #800000;">panel-title</span><span style="color: #800000;">"</span>&gt;Panel title&lt;/h3&gt;
                &lt;/div&gt;
                &lt;div <span style="color: #0000ff;">class</span>=<span style="color: #800000;">"</span><span style="color: #800000;">panel-body</span><span style="color: #800000;">"</span>&gt;<span style="color: #000000;">
                    Panel content
                </span>&lt;/div&gt;
            &lt;/div&gt;
            &lt;div <span style="color: #0000ff;">class</span>=<span style="color: #800000;">"</span><span style="color: #800000;">panel panel-info</span><span style="color: #800000;">"</span>&gt;
                &lt;div <span style="color: #0000ff;">class</span>=<span style="color: #800000;">"</span><span style="color: #800000;">panel-heading</span><span style="color: #800000;">"</span>&gt;
                    &lt;h3 <span style="color: #0000ff;">class</span>=<span style="color: #800000;">"</span><span style="color: #800000;">panel-title</span><span style="color: #800000;">"</span>&gt;Panel title&lt;/h3&gt;
                &lt;/div&gt;
                &lt;div <span style="color: #0000ff;">class</span>=<span style="color: #800000;">"</span><span style="color: #800000;">panel-body</span><span style="color: #800000;">"</span>&gt;<span style="color: #000000;">
                    Panel content
                </span>&lt;/div&gt;
            &lt;/div&gt;
            &lt;div <span style="color: #0000ff;">class</span>=<span style="color: #800000;">"</span><span style="color: #800000;">panel panel-success</span><span style="color: #800000;">"</span>&gt;
                &lt;div <span style="color: #0000ff;">class</span>=<span style="color: #800000;">"</span><span style="color: #800000;">panel-heading</span><span style="color: #800000;">"</span>&gt;
                    &lt;h3 <span style="color: #0000ff;">class</span>=<span style="color: #800000;">"</span><span style="color: #800000;">panel-title</span><span style="color: #800000;">"</span>&gt;Panel title&lt;/h3&gt;
                &lt;/div&gt;
                &lt;div <span style="color: #0000ff;">class</span>=<span style="color: #800000;">"</span><span style="color: #800000;">panel-body</span><span style="color: #800000;">"</span>&gt;<span style="color: #000000;">
                    Panel content
                </span>&lt;/div&gt;
            &lt;/div&gt;
    
        &lt;/div&gt;
    &lt;/div&gt;
    

    </div>

    </body>
    </html>

    View Code

    访问首页,效果如下:

    个人站点展示

    比如博客园范围个人站点是域名加用户名,就可以了,比如:

    https://www.cnblogs.com/xiao987334176

    如果用户不存在,会提示404页面

    增加404页面

    修改urls.py,增加路径。注意导入re_path

    from django.contrib import admin
    from django.urls import path,re_path
    from blog import views
    urlpatterns = [
        path('admin/', admin.site.urls),
        path('login/', views.login),
        path('index/', views.index),
        path('logout/', views.logout),
        path('', views.index),
        re_path('(?P<username>w+)', views.homesite),
    ]
    View Code

    修改views.py,增加视图函数

    def homesite(request,username):
        """
        查询
        :param request:
        :param username:
        :return:
        """
    
    <span style="color: #008000;">#</span><span style="color: #008000;"> 查询当前站点的用户对象</span>
    user=UserInfo.objects.filter(username=<span style="color: #000000;">username).first()
    </span><span style="color: #0000ff;">if</span> <span style="color: #0000ff;">not</span><span style="color: #000000;"> user:
        </span><span style="color: #0000ff;">return</span> render(request,<span style="color: #800000;">"</span><span style="color: #800000;">not_found.html</span><span style="color: #800000;">"</span><span style="color: #000000;">)
    
    </span><span style="color: #0000ff;">return</span> render(request,<span style="color: #800000;">"</span><span style="color: #800000;">homesite.html</span><span style="color: #800000;">"</span>,{<span style="color: #800000;">"</span><span style="color: #800000;">user</span><span style="color: #800000;">"</span>:user})</pre>
    
    View Code

    在templates目录创建文件not_found.html

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        <link rel="stylesheet" href="/static/bootstrap/css/bootstrap.css">
    </head>
    <body>
    

    <div class="container" style="margin-top: 100px">
    <div class="text-center">
    <a href="http://www.cnblogs.com/"><img src="/static/img/logo_small.gif" alt="cnblogs"></a>
    <p><b>404.</b> 抱歉! 您访问的资源不存在!</p>
    <p class="d">请确认您输入的网址是否正确,如果问题持续存在,请发邮件至 xx@qq.com 与 <strong style="font-size: 28px">xiao</strong> 联系。</p>
    <p><a href="/">返回网站首页</a></p>

    &lt;/div&gt;
    

    </div>
    </body>
    </html>

    View Code

    创建homesite.html

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
    <h3>{{ user }}</h3>
    </body>
    </html>
    View Code

    访问网页:http://127.0.0.1:8000/xiao

    访问一个不存在的用户

    http://127.0.0.1:8000/123

    页面提示404

    展示文章列表

    修改homesite视图函数

    def homesite(request,username):
        """
        查询
        :param request:
        :param username:
        :return:
        """
    
    <span style="color: #008000;">#</span><span style="color: #008000;"> 查询当前站点的用户对象</span>
    user=UserInfo.objects.filter(username=<span style="color: #000000;">username).first()
    </span><span style="color: #0000ff;">if</span> <span style="color: #0000ff;">not</span><span style="color: #000000;"> user:
        </span><span style="color: #0000ff;">return</span> render(request,<span style="color: #800000;">"</span><span style="color: #800000;">not_found.html</span><span style="color: #800000;">"</span><span style="color: #000000;">)
    </span><span style="color: #008000;">#</span><span style="color: #008000;"> 查询当前站点对象</span>
    blog=<span style="color: #000000;">user.blog
    
    </span><span style="color: #008000;">#</span><span style="color: #008000;"> 查询当前用户发布的所有文章</span>
    article_list=Article.objects.filter(user__username=<span style="color: #000000;">username)
    
    </span><span style="color: #0000ff;">return</span> render(request,<span style="color: #800000;">"</span><span style="color: #800000;">homesite.html</span><span style="color: #800000;">"</span>,{<span style="color: #800000;">"</span><span style="color: #800000;">blog</span><span style="color: #800000;">"</span>:blog,<span style="color: #800000;">"</span><span style="color: #800000;">article_list</span><span style="color: #800000;">"</span>:article_list})</pre>
    
    View Code

    修改homesite.html

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    
    &lt;style&gt;
        *<span style="color: #000000;">{
            margin: 0;
            padding: 0;
        }
        .header{
             </span>100%<span style="color: #000000;">;
            height: 59px;
            background</span>-color: <span style="color: #008000;">#</span><span style="color: #008000;">369;</span>
    

    }
    .header .title{
    line
    -height: 59px;
    color: white;
    font
    -weight: lighter;
    margin
    -left: 20px;
    font
    -size: 18px;
    }

        .left_region{
            margin</span>-<span style="color: #000000;">top: 10px;
        }
    
        .info{
          margin</span>-<span style="color: #000000;">top: 10px;
          color: darkgray;
    
        }
    </span>&lt;/style&gt;
    &lt;link rel=<span style="color: #800000;">"</span><span style="color: #800000;">stylesheet</span><span style="color: #800000;">"</span> href=<span style="color: #800000;">"</span><span style="color: #800000;">/static/bootstrap/css/bootstrap.css</span><span style="color: #800000;">"</span>&gt;
    &lt;script src=<span style="color: #800000;">"</span><span style="color: #800000;">/static/js/jquery.js</span><span style="color: #800000;">"</span>&gt;&lt;/script&gt;
    &lt;script src=<span style="color: #800000;">"</span><span style="color: #800000;">/static/bootstrap/js/bootstrap.js</span><span style="color: #800000;">"</span>&gt;&lt;/script&gt;
    

    </head>
    <body>
    <div class="header">
    <p class="title">{{ blog.title }}</p>
    </div>

    <div class="container-fluid">
    <div class="row">
    <div class="col-md-3">
    <div class="left_region">
    <div class="panel panel-success">
    <div class="panel-heading">
    <h3 class="panel-title">Panel title</h3>
    </div>
    <div class="panel-body">
    Panel content
    </div>
    </div>
    <div class="panel panel-warning">
    <div class="panel-heading">
    <h3 class="panel-title">Panel title</h3>
    </div>
    <div class="panel-body">
    Panel content
    </div>
    </div>
    <div class="panel panel-info">
    <div class="panel-heading">
    <h3 class="panel-title">Panel title</h3>
    </div>
    <div class="panel-body">
    Panel content
    </div>
    </div>
    </div>
    </div>
    <div class="col-md-9">

             &lt;div <span style="color: #0000ff;">class</span>=<span style="color: #800000;">"</span><span style="color: #800000;">article_list</span><span style="color: #800000;">"</span>&gt;<span style="color: #000000;">
                {</span>% <span style="color: #0000ff;">for</span> article <span style="color: #0000ff;">in</span> article_list %<span style="color: #000000;">}
                 </span>&lt;div <span style="color: #0000ff;">class</span>=<span style="color: #800000;">"</span><span style="color: #800000;">article_item clearfix</span><span style="color: #800000;">"</span>&gt;
                      &lt;h5&gt;&lt;a href=<span style="color: #800000;">""</span>&gt;{{ article.title }}&lt;/a&gt;&lt;/h5&gt;
                      &lt;div&gt;
    
                          &lt;span <span style="color: #0000ff;">class</span>=<span style="color: #800000;">"</span><span style="color: #800000;">small desc </span><span style="color: #800000;">"</span>&gt;<span style="color: #000000;">
                              {{ article.desc }}
                          </span>&lt;/span&gt;
    
                      &lt;/div&gt;
                      &lt;div <span style="color: #0000ff;">class</span>=<span style="color: #800000;">"</span><span style="color: #800000;">info small pull-right</span><span style="color: #800000;">"</span>&gt;<span style="color: #000000;">
                            发布于 </span>&lt;span&gt;{{ article.create_time|date:<span style="color: #800000;">'</span><span style="color: #800000;">Y-m-d H:i</span><span style="color: #800000;">'</span> }}&lt;/span&gt;&amp;nbsp;&amp;<span style="color: #000000;">nbsp;
                           </span>&lt;span <span style="color: #0000ff;">class</span>=<span style="color: #800000;">"</span><span style="color: #800000;">glyphicon glyphicon-comment</span><span style="color: #800000;">"</span>&gt;&lt;/span&gt;&lt;a href=<span style="color: #800000;">""</span>&gt;评论({{ article.comment_count }})&lt;/a&gt;&amp;nbsp;&amp;<span style="color: #000000;">nbsp;
                           </span>&lt;span <span style="color: #0000ff;">class</span>=<span style="color: #800000;">"</span><span style="color: #800000;">glyphicon glyphicon-thumbs-up</span><span style="color: #800000;">"</span>&gt;&lt;/span&gt;&lt;a href=<span style="color: #800000;">""</span>&gt;点赞({{ article.up_count }})&lt;/a&gt;
                      &lt;/div&gt;
                 &lt;/div&gt;
                    &lt;hr&gt;<span style="color: #000000;">
                {</span>% endfor %<span style="color: #000000;">}
            </span>&lt;/div&gt;
    
        &lt;/div&gt;
    &lt;/div&gt;
    

    </div>

    </body>
    </html>

    View Code

    访问xiao的个人站点,效果如下:

     这个时候发现,左上角没有显示博客标题。那是因为用户认证表的blog_id字段默认为空,需要在admin后台绑定一下

    登录到后台,点击用户表,点击指定的用户xiao

    拉到最下面,绑定blog,点击保存

    再次刷新个人站点,发现出来了!

    作业:

    查询当前站点每一个分类的名称以及对应的文章数

    查询当前站点每一个标签的名称以及对应的文章数

    答案:

    修改homesite视图函数

    def homesite(request,username):
        """
        查询
        :param request:
        :param username:
        :return:
        """
        # 查询当前站点的用户对象
        user=UserInfo.objects.filter(username=username).first()
        if not user:
            return render(request,"not_found.html")
        # 查询当前站点对象
    
        blog=user.blog
    
    </span><span style="color: #008000;">#</span><span style="color: #008000;"> 查询当前用户发布的所有文章</span>
    article_list=Article.objects.filter(user__username=<span style="color: #000000;">username)
    
    </span><span style="color: #008000;">#</span><span style="color: #008000;"> 查询当前站点每一个分类的名称以及对应的文章数</span>
    cate_list = Category.objects.filter(blog=blog).annotate(c=Count(<span style="color: #800000;">"</span><span style="color: #800000;">article__title</span><span style="color: #800000;">"</span>)).values(<span style="color: #800000;">"</span><span style="color: #800000;">title</span><span style="color: #800000;">"</span>,<span style="color: #800000;">"</span><span style="color: #800000;">c</span><span style="color: #800000;">"</span><span style="color: #000000;">)
    </span><span style="color: #0000ff;">print</span><span style="color: #000000;">(cate_list)
    
    </span><span style="color: #008000;">#</span><span style="color: #008000;"> 查询当前站点每一个标签的名称以及对应的文章数</span>
    tag_list = Tag.objects.filter(blog=blog).annotate(c=Count(<span style="color: #800000;">"</span><span style="color: #800000;">article__title</span><span style="color: #800000;">"</span>)).values(<span style="color: #800000;">"</span><span style="color: #800000;">title</span><span style="color: #800000;">"</span>,<span style="color: #800000;">"</span><span style="color: #800000;">c</span><span style="color: #800000;">"</span><span style="color: #000000;">)
    </span><span style="color: #0000ff;">print</span><span style="color: #000000;">(tag_list)
    
    dict </span>= {<span style="color: #800000;">"</span><span style="color: #800000;">blog</span><span style="color: #800000;">"</span><span style="color: #000000;">:blog,
            </span><span style="color: #800000;">"</span><span style="color: #800000;">article_list</span><span style="color: #800000;">"</span><span style="color: #000000;">:article_list,
            </span><span style="color: #800000;">"</span><span style="color: #800000;">category_count</span><span style="color: #800000;">"</span><span style="color: #000000;">:cate_list,
            </span><span style="color: #800000;">"</span><span style="color: #800000;">tag_count</span><span style="color: #800000;">"</span><span style="color: #000000;">:tag_list,
            }
    
    </span><span style="color: #0000ff;">return</span> render(request,<span style="color: #800000;">"</span><span style="color: #800000;">homesite.html</span><span style="color: #800000;">"</span>,dict)</pre>
    
    View Code

    修改homesite.html

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    
    &lt;style&gt;
        *<span style="color: #000000;">{
            margin: 0;
            padding: 0;
        }
        .header{
             </span>100%<span style="color: #000000;">;
            height: 59px;
            background</span>-color: <span style="color: #008000;">#</span><span style="color: #008000;">369;</span>
    

    }
    .header .title{
    line
    -height: 59px;
    color: white;
    font
    -weight: lighter;
    margin
    -left: 20px;
    font
    -size: 18px;
    }

        .left_region{
            margin</span>-<span style="color: #000000;">top: 10px;
        }
    
        .info{
          margin</span>-<span style="color: #000000;">top: 10px;
          color: darkgray;
    
        }
        h5 a {
            color: </span><span style="color: #008000;">#</span><span style="color: #008000;">105cb6;</span>
            font-<span style="color: #000000;">size: 14px;
            font</span>-<span style="color: #000000;">weight: bold;
            text</span>-<span style="color: #000000;">decoration: underline;
        }
    
    </span>&lt;/style&gt;
    &lt;link rel=<span style="color: #800000;">"</span><span style="color: #800000;">stylesheet</span><span style="color: #800000;">"</span> href=<span style="color: #800000;">"</span><span style="color: #800000;">/static/bootstrap/css/bootstrap.css</span><span style="color: #800000;">"</span>&gt;
    &lt;script src=<span style="color: #800000;">"</span><span style="color: #800000;">/static/js/jquery.js</span><span style="color: #800000;">"</span>&gt;&lt;/script&gt;
    &lt;script src=<span style="color: #800000;">"</span><span style="color: #800000;">/static/bootstrap/js/bootstrap.js</span><span style="color: #800000;">"</span>&gt;&lt;/script&gt;
    

    </head>
    <body>
    <div class="header">
    <p class="title">{{ blog.title }}</p>
    </div>

    <div class="container-fluid">
    <div class="row">
    <div class="col-md-3">
    <div class="left_region">
    <div class="panel panel-success">
    <div class="panel-heading">
    <h3 class="panel-title">我的标签</h3>
    </div>
    {
    % for foo in category_count %}
    <div class="panel-body">
    {{ foo.title }}({{ foo.c }})
    </div>

                     {</span>% endfor %<span style="color: #000000;">}
    
            </span>&lt;/div&gt;
                 &lt;div <span style="color: #0000ff;">class</span>=<span style="color: #800000;">"</span><span style="color: #800000;">panel panel-warning</span><span style="color: #800000;">"</span>&gt;
                    &lt;div <span style="color: #0000ff;">class</span>=<span style="color: #800000;">"</span><span style="color: #800000;">panel-heading</span><span style="color: #800000;">"</span>&gt;
                        &lt;h3 <span style="color: #0000ff;">class</span>=<span style="color: #800000;">"</span><span style="color: #800000;">panel-title</span><span style="color: #800000;">"</span>&gt;随笔分类&lt;/h3&gt;
                    &lt;/div&gt;<span style="color: #000000;">
                     {</span>% <span style="color: #0000ff;">for</span> foo <span style="color: #0000ff;">in</span> tag_count %<span style="color: #000000;">}
                         </span>&lt;div <span style="color: #0000ff;">class</span>=<span style="color: #800000;">"</span><span style="color: #800000;">panel-body</span><span style="color: #800000;">"</span>&gt;<span style="color: #000000;">
                    {{ foo.title }}({{ foo.c }})
                </span>&lt;/div&gt;<span style="color: #000000;">
    
                     {</span>% endfor %<span style="color: #000000;">}
    
                </span>&lt;/div&gt;
                 &lt;div <span style="color: #0000ff;">class</span>=<span style="color: #800000;">"</span><span style="color: #800000;">panel panel-info</span><span style="color: #800000;">"</span>&gt;
                    &lt;div <span style="color: #0000ff;">class</span>=<span style="color: #800000;">"</span><span style="color: #800000;">panel-heading</span><span style="color: #800000;">"</span>&gt;
                        &lt;h3 <span style="color: #0000ff;">class</span>=<span style="color: #800000;">"</span><span style="color: #800000;">panel-title</span><span style="color: #800000;">"</span>&gt;随笔档案&lt;/h3&gt;
                    &lt;/div&gt;
                    &lt;div <span style="color: #0000ff;">class</span>=<span style="color: #800000;">"</span><span style="color: #800000;">panel-body</span><span style="color: #800000;">"</span>&gt;<span style="color: #000000;">
                        Panel content
                    </span>&lt;/div&gt;
                &lt;/div&gt;
            &lt;/div&gt;
        &lt;/div&gt;
        &lt;div <span style="color: #0000ff;">class</span>=<span style="color: #800000;">"</span><span style="color: #800000;">col-md-9</span><span style="color: #800000;">"</span>&gt;
    
             &lt;div <span style="color: #0000ff;">class</span>=<span style="color: #800000;">"</span><span style="color: #800000;">article_list</span><span style="color: #800000;">"</span>&gt;<span style="color: #000000;">
                {</span>% <span style="color: #0000ff;">for</span> article <span style="color: #0000ff;">in</span> article_list %<span style="color: #000000;">}
    
                 </span>&lt;div <span style="color: #0000ff;">class</span>=<span style="color: #800000;">"</span><span style="color: #800000;">article_item clearfix</span><span style="color: #800000;">"</span>&gt;
                      &lt;h5&gt;&lt;a href=<span style="color: #800000;">""</span>&gt;{{ article.title }}&lt;/a&gt;&lt;/h5&gt;
                      &lt;div&gt;
    
                          &lt;span <span style="color: #0000ff;">class</span>=<span style="color: #800000;">"</span><span style="color: #800000;">small desc </span><span style="color: #800000;">"</span>&gt;<span style="color: #000000;">
                              {{ article.desc }}
                          </span>&lt;/span&gt;
    
                      &lt;/div&gt;
                      &lt;div <span style="color: #0000ff;">class</span>=<span style="color: #800000;">"</span><span style="color: #800000;">info small pull-right</span><span style="color: #800000;">"</span>&gt;<span style="color: #000000;">
                            发布于 </span>&lt;span&gt;{{ article.create_time|date:<span style="color: #800000;">'</span><span style="color: #800000;">Y-m-d H:i</span><span style="color: #800000;">'</span> }}&lt;/span&gt;&amp;nbsp;&amp;<span style="color: #000000;">nbsp;
                           </span>&lt;img src=<span style="color: #800000;">"</span><span style="color: #800000;">/static/img/icon_comment.gif</span><span style="color: #800000;">"</span> alt=<span style="color: #800000;">""</span>&gt;&lt;a href=<span style="color: #800000;">""</span>&gt;评论({{ article.comment_count }})&lt;/a&gt;&amp;nbsp;&amp;<span style="color: #000000;">nbsp;
                           </span>&lt;span <span style="color: #0000ff;">class</span>=<span style="color: #800000;">"</span><span style="color: #800000;">glyphicon glyphicon-thumbs-up</span><span style="color: #800000;">"</span>&gt;&lt;/span&gt;&lt;a href=<span style="color: #800000;">""</span>&gt;点赞({{ article.up_count }})&lt;/a&gt;
                      &lt;/div&gt;
                 &lt;/div&gt;
                    &lt;hr&gt;<span style="color: #000000;">
                {</span>% endfor %<span style="color: #000000;">}
            </span>&lt;/div&gt;
    
        &lt;/div&gt;
    &lt;/div&gt;
    

    </div>

    </body>
    </html>

    View Code

    进入admin后台,添加一个tag。增加一篇文章

    重新访问个人站点网页,效果如下:

     


    参考资料:

    Django 基础教程

    转载声明:
    作者:肖祥
    出处: https://www.cnblogs.com/xiao987334176/

  • 相关阅读:
    在Selenium自动化中查找损坏的链接
    WebDriverManager
    在TestNG中重试失败的测试
    算法:汉诺塔
    Java 多线程
    spring ioc原理(看完后大家可以自己写一个spring)
    Apache与Nginx的区别
    Apache与Nginx的区分比较
    Java 设计模式
    Java 理论与实践: 正确使用 Volatile 变量
  • 原文地址:https://www.cnblogs.com/bqwzx/p/10198767.html
Copyright © 2011-2022 走看看