技术交流QQ群:1027579432,欢迎你的加入!

本教程来源于B站杨仕航Django2.0开发视频教程,如需转载,必须注明来源!

1.Bootstra的响应式设计

栅格参数.png
  • Bootstrap需要为页面内容和栅格系统包裹一个.container容器,栅格系统中的所有列(column)必须放在.row内。

2.栅格系统代码基本结构

<div class="container">
    <div class="row">
        <div class="col-xx-*"></div>
        <div class="col-xx-*"></div>
    </div>
</div>
  • 因为博客分类的页面与blog这个Django应用联系更紧密,因此将mysite根目录下的templates文件夹下的blog文件夹剪切至blog文件目录下的templates文件夹中。这样,既方便整个项目的迁移,又不用去修改views.py文件中的路径。
  • 修改blog文件夹下的views.py文件,在blog_list()函数中返回博客分类字段。如下所示:
    context['blog_types'] = BlogType.objects.all()
  • 打开博客列表前端页面对应的blog_list.html文件,添加Bootstrap中的栅格系统后的文件内容如下所示:
    {% extends 'base.html' %}
    {# blog_list.html文件内容 #}
    {# 页面标题 #}
    {% block title %}我的网站{% endblock %}
    {% block nav_blog_active %}active{% endblock %}
    
    
    
    {# 页面内容 #}
    {% block content %}
        <div class="container">
            <div class="row">
                <div class="col-xs-12 col-sm-8 col-md-9 col-lg-10">
                    <div class="panel panel-default">
                        <div class="panel-heading">
                            博客列表(一共有{{ blogs|length }}篇博客)
                        </div>
                        <div class="panel-body">
                            <!-- 下一行中的blogs来自于views.py中的context['blogs'] = Blog.objects.all() -->
                            {% for blog in blogs %}
                            <!-- 下一行中的blog.title来自于models.py中的title = models.CharField(max_length=50) -->
                                <a href="{% url 'blog_detail' blog.pk %}"><h3>{{ blog.title }}</h3></a>
                                <p>{{ blog.content|truncatechars:30 }}</p>
                            {% empty %}
                                <p>--暂无博客,敬请期待--</p>
                            {% endfor %}
    
                        </div>
                    </div>
    
                </div>
    
                <div class="hidden-xs col-sm-4 col-md-3 col-lg-2">
                    <div class="panel panel-default">
                        <div class="panel-heading">
                            博客分类
                        </div>
                        <div class="panel-body">
                            <ul style="list-style: none;">
                                {% for blog_type in blog_types %}
                                    <li><a href="{% url 'blogs_with_type' blog_type.pk %}">{{ blog_type.type_name }}</a></li>
                                {% empty %}
                                    <li>暂无分类</li>
                                {% endfor %}
                            </ul>
                        </div>
                    </div>
                </div>
            </div>
        </div>
    
    {% endblock %}
  • 对上述blog_list.html文件进行修改,主要修改ul style="list-style: none;"></ul>。在static目录下创建blog.css文件,将样式写在该文件下,如下所示:
    ul.blog-types {
        list-style: none;
    }
  • 然后在blog_list.html文件中引入blog.css文件,即添加内容后的blog_list.html如下所示:
    {% extends 'base.html' %}
    {# blog_list.html文件内容 #}
    {# 页面标题 #}
    {% block title %}我的网站{% endblock %}
    {% block nav_blog_active %}active{% endblock %}
    
    {% load staticfiles %}
    {% block header_extends %}
        <link rel="stylesheet" href="{% static 'blog.css' %}">
    {% endblock %}
    
    {# 页面内容 #}
    {% block content %}
        <div class="container">
            <div class="row">
                <div class="col-xs-12 col-sm-8 col-md-9 col-lg-10">
                    <div class="panel panel-default">
                        <div class="panel-heading">
                            博客列表(一共有{{ blogs|length }}篇博客)
                        </div>
                        <div class="panel-body">
                            <!-- 下一行中的blogs来自于views.py中的context['blogs'] = Blog.objects.all() -->
                            {% for blog in blogs %}
                            <!-- 下一行中的blog.title来自于models.py中的title = models.CharField(max_length=50) -->
                                <a href="{% url 'blog_detail' blog.pk %}"><h3>{{ blog.title }}</h3></a>
                                <p>{{ blog.content|truncatechars:30 }}</p>
                            {% empty %}
                                <p>--暂无博客,敬请期待--</p>
                            {% endfor %}
    
                        </div>
                    </div>
    
                </div>
    
                <div class="hidden-xs col-sm-4 col-md-3 col-lg-2">
                    <div class="panel panel-default">
                        <div class="panel-heading">
                            博客分类
                        </div>
                        <div class="panel-body">
                            <ul class="blog-types">
                                {% for blog_type in blog_types %}
                                    <li><a href="{% url 'blogs_with_type' blog_type.pk %}">{{ blog_type.type_name }}</a></li>
                                {% empty %}
                                    <li>暂无分类</li>
                                {% endfor %}
                            </ul>
                        </div>
                    </div>
                </div>
            </div>
        </div>
    
    {% endblock %}
  • 因为blog.css与具体的Django应用blog相关,所以需要在Django应用blog文件夹下创建static文件夹,然后在该文件夹下创建blog文件夹。最后,将blog.css文件粘贴到blog文件夹中即可。注意:修改blog_list.html文件中加载blog.css文件的路径为:<link rel="stylesheet" href="{% static 'blog/blog.css' %}">,再重启本地服务。
  • 因为博客首页预览显示的文字只有30,所以修改blog_list.html文件中的<p>{{ blog.content|truncatechars:30 }}</p>为** <p>{{ blog.content|truncatechars:120 }}</p>**,具体效果如下所示:
    博客首页预览显示的文字个数.png
  • 如上图所示,每篇博客的标题与博客列表(一共有3篇博客)之间的间距太大,因此修改blog_list.html,增加一个class名为blog的div盒子。如下所示:
    {% extends 'base.html' %}
    {# blog_list.html文件内容 #}
    {# 页面标题 #}
    {% block title %}我的网站{% endblock %}
    {% block nav_blog_active %}active{% endblock %}
    
    {% load staticfiles %}
    {% block header_extends %}
        <link rel="stylesheet" href="{% static 'blog/blog.css' %}">
    {% endblock %}
    
    {# 页面内容 #}
    {% block content %}
        <div class="container">
            <div class="row">
                <div class="col-xs-12 col-sm-8 col-md-9 col-lg-10">
                    <div class="panel panel-default">
                        <div class="panel-heading">
                            博客列表(一共有{{ blogs|length }}篇博客)
                        </div>
                        <div class="panel-body">
                            <!-- 下一行中的blogs来自于views.py中的context['blogs'] = Blog.objects.all() -->
                            {% for blog in blogs %}
                                <div class="blog">
                                    <!-- 下一行中的blog.title来自于models.py中的title = models.CharField(max_length=50) -->
                                    <h3><a href="{% url 'blog_detail' blog.pk %}">{{ blog.title }}</a></h3>
                                    <p>{{ blog.content|truncatechars:120 }}</p>
                                </div>
                            {% empty %}
                               <div class="bog">
                                    <h3>暂无博客,敬请期待</h3>
                               </div>
                            {% endfor %}
                        </div>
                    </div>
    
                </div>
    
                <div class="hidden-xs col-sm-4 col-md-3 col-lg-2">
                    <div class="panel panel-default">
                        <div class="panel-heading">
                            博客分类
                        </div>
                        <div class="panel-body">
                            <ul class="blog-types">
                                {% for blog_type in blog_types %}
                                    <li><a href="{% url 'blogs_with_type' blog_type.pk %}">{{ blog_type.type_name }}</a></li>
                                {% empty %}
                                    <li>暂无分类</li>
                                {% endfor %}
                            </ul>
                        </div>
                    </div>
                </div>
            </div>
        </div>
    
    {% endblock %}
  • 给blog_list.html文件中的h3和class=blog的div标签增加css样式进行修饰,打开blog.css文件,增加如下内容:
    div.blog:not(:last-child) {
        margin-bottom: 2em;
        padding-bottom: 1em;
        border: 1px solid #eee;
    }
    
    div.blog h3 {
        margin-top: 0.5em;
    }
  • 在blog_list.html文件中增加博客的分类与发表时间,修改后的blog_list.html如下所示:
    {% extends 'base.html' %}
    {# blog_list.html文件内容 #}
    {# 页面标题 #}
    {% block title %}我的网站{% endblock %}
    {% block nav_blog_active %}active{% endblock %}
    
    {% load staticfiles %}
    {% block header_extends %}
        <link rel="stylesheet" href="{% static 'blog/blog.css' %}">
    {% endblock %}
    
    {# 页面内容 #}
    {% block content %}
        <div class="container">
            <div class="row">
                <div class="col-xs-12 col-sm-8 col-md-9 col-lg-10">
                    <div class="panel panel-default">
                        <div class="panel-heading">
                            博客列表(一共有{{ blogs|length }}篇博客)
                        </div>
                        <div class="panel-body">
                            <!-- 下一行中的blogs来自于views.py中的context['blogs'] = Blog.objects.all() -->
                            {% for blog in blogs %}
                                <div class="blog">
                                    <!-- 下一行中的blog.title来自于models.py中的title = models.CharField(max_length=50) -->
                                    <h3><a href="{% url 'blog_detail' blog.pk %}">{{ blog.title }}</a></h3>
                                    <p class="blog-info">
                                        分类:<a href="{% url 'blogs_with_type' blog.blog_type.pk %}">{{ blog.blog_type }}</a> &nbsp&nbsp&nbsp
                                        发表日期:{{ blog.created_time|date:"Y-m-d" }}
                                    </p>
                                    <p>{{ blog.content|truncatechars:120 }}</p>
                                </div>
                            {% empty %}
                               <div class="bog">
                                    <h3>暂无博客,敬请期待</h3>
                               </div>
                            {% endfor %}
                        </div>
                    </div>
    
                </div>
    
                <div class="hidden-xs col-sm-4 col-md-3 col-lg-2">
                    <div class="panel panel-default">
                        <div class="panel-heading">
                            博客分类
                        </div>
                        <div class="panel-body">
                            <ul class="blog-types">
                                {% for blog_type in blog_types %}
                                    <li><a href="{% url 'blogs_with_type' blog_type.pk %}">{{ blog_type.type_name }}</a></li>
                                {% empty %}
                                    <li>暂无分类</li>
                                {% endfor %}
                            </ul>
                        </div>
                    </div>
                </div>
            </div>
        </div>
    
    {% endblock %}
  • 修改博客正文内容与博客分类与发表日期之间的间距,在blog.css中增加如下代码:
    div.blog p.blog-info {
        margin-bottom: 0;
    }
  • 接着将分类与发表日期修改为图标表示,在blog_list.html中增加如下代码:
    <span class="glyphicon glyphicon-tag"></span>
    <span class="glyphicon glyphicon-time"></span>
  • 点击首页中的博客,可以显示全部的博客。点击页面中的随笔,可以进入所有都是随笔类型博客。这个前端页面与主页中显示的全部博客页面类型。blog_list.html模板文件和blogs_with_type.html模板文件的不同是一个是统计总的博客数量,一个是按博客类型统计数量。因此,可以对blog_list.html模板文件进行修改。首先在blog_list.html文件中,增加模板标签{% block blog_list_title %}博客列表(一共有{{ blogs|length }}篇博客){% endblock %},这样可以根据blogs_with_type.html中与blog_list.html不同部分的内容对模板标签进行替换,增加后的blog_list.html文件如下所示:
    {% extends 'base.html' %}
    {# blog_list.html文件内容 #}
    {# 页面标题 #}
    {% block title %}我的网站{% endblock %}
    {% block nav_blog_active %}active{% endblock %}
    
    {% load staticfiles %}
    {% block header_extends %}
        <link rel="stylesheet" href="{% static 'blog/blog.css' %}">
    {% endblock %}
    
    {# 页面内容 #}
    {% block content %}
        <div class="container">
            <div class="row">
                <div class="col-xs-12 col-sm-8 col-md-9 col-lg-10">
                    <div class="panel panel-default">
                        <div class="panel-heading">
                            {% block blog_list_title %}博客列表(一共有{{ blogs|length }}篇博客){% endblock %}
                        </div>
                        <div class="panel-body">
                            <!-- 下一行中的blogs来自于views.py中的context['blogs'] = Blog.objects.all() -->
                            {% for blog in blogs %}
                                <div class="blog">
                                    <!-- 下一行中的blog.title来自于models.py中的title = models.CharField(max_length=50) -->
                                    <h3><a href="{% url 'blog_detail' blog.pk %}">{{ blog.title }}</a></h3>
                                    <p class="blog-info">
                                        <span class="glyphicon glyphicon-tag"></span><a href="{% url 'blogs_with_type' blog.blog_type.pk %}">{{ blog.blog_type }}</a> &nbsp&nbsp&nbsp
                                        <span class="glyphicon glyphicon-time"></span>{{ blog.created_time|date:"Y-m-d" }}
                                    </p>
                                    <p>{{ blog.content|truncatechars:120 }}</p>
                                </div>
                            {% empty %}
                               <div class="bog">
                                    <h3>暂无博客,敬请期待</h3>
                               </div>
                            {% endfor %}
                        </div>
                    </div>
    
                </div>
    
                <div class="hidden-xs col-sm-4 col-md-3 col-lg-2">
                    <div class="panel panel-default">
                        <div class="panel-heading">
                            博客分类
                        </div>
                        <div class="panel-body">
                            <ul class="blog-types">
                                {% for blog_type in blog_types %}
                                    <li><a href="{% url 'blogs_with_type' blog_type.pk %}">{{ blog_type.type_name }}</a></li>
                                {% empty %}
                                    <li>暂无分类</li>
                                {% endfor %}
                            </ul>
                        </div>
                    </div>
                </div>
            </div>
        </div>
    
    {% endblock %}
  • 接着对blogs_with_type.html文件进行修改,引用blog_list.html文件中已经写好的部分内容。修改后的内容如下所示:
    {% extends 'blog/blog_list.html' %}
    
    {# blogs_with_type.html文件内容 #}
    
    {# 页面标题 #}
    {% block title %}
        {{ blog_type.type_name }}
    {% endblock %}
    
    {% block blog_list_title %}
        分类:{{ blog_type.type_name }}(一共有{{ blogs|length }}篇博客)
    {% endblock %}
  • 因为blog文件目录下的views.py中缺少博客分类对应的处理方法,所以出现下面的画面:


    博客分类显示暂无分类.png
  • 打开blog文件目录下的views.py文件,对blogs_with_type()方法进行修改,修改后的views.py内容如下所示:
    from django.shortcuts import render_to_response, get_object_or_404
    from .models import Blog, BlogType
    # Create your views here.
    
    
    def blog_list(request):
        context = {}
        context['blogs'] = Blog.objects.all()
        context['blog_types'] = BlogType.objects.all()
        return render_to_response('blog/blog_list.html', context)
    
    
    def blog_detail(request, blog_pk):
        context = {}
        context['blog'] = get_object_or_404(Blog, pk=blog_pk)
        return render_to_response('blog/blog_detail.html', context)
    
    
    def blogs_with_type(request, blog_type_pk):
        context = {}
        blog_type = get_object_or_404(BlogType, pk=blog_type_pk)
        context['blog_type'] = blog_type
        context['blogs'] = Blog.objects.filter(blog_type=blog_type)
        context['blog_types'] = BlogType.objects.all()
        return render_to_response('blog/blogs_with_type.html', context)
  • 在blogs_with_type.html模板文件中增加查看全部博客,便于显示所有对应类别的博客。因此,对blogs_with_type.html文件进行修改,修改后的内容如下所示:
    {% extends 'blog/blog_list.html' %}
    
    {# blogs_with_type.html文件内容 #}
    
    {# 页面标题 #}
    {% block title %}
        {{ blog_type.type_name }}
    {% endblock %}
    
    {% block blog_list_title %}
        分类:{{ blog_type.type_name }}(一共有{{ blogs|length }}篇博客)
        <a href="{% url 'blogs_with_type' blog_type.pk %}">查看全部博客</a>
    {% endblock %}
  • 对具体某篇博客的模板文件blog_detail.html进行修改,修改后的内容如下所示:
    {% extends 'base.html' %}
    
    {# 页面标题 #}
    {% block title %}
        {{ blog.title }}
    {% endblock %}
    
    {% block nav_blog_active %}
        active
    {% endblock %}
    
    
    {% load staticfiles %}
    {% block header_extends %}
        <link rel="stylesheet" href="{% static 'blog/blog.css' %}">
    {% endblock %}
    
    
    {# 页面内容 #}
    {% block content %}
        <div class="contaiiner">
            <div class="row">
                <div class="col-xs-10 col-xs-offset-1">
                    <h3>{{ blog.title }}</h3>
                    <ul class="blog-info-description">
                        <li>作者: {{ blog.author }}</li>
                        <li>分类:
                            <a href="{% url 'blogs_with_type' blog.blog_type.pk %} ">
                                {{ blog.blog_type }}
                            </a>
                        </li>
                        <li>发表日期: {{ blog.created_time|date:"Y-m-d" }}</li>
                    </ul>
    
                    <div class="blog-content">{{ blog.content }}</div>
                </div>
            </div>
        </div>
    
    {% endblock %}
  • 最后,对blog_detail.html进行css美化修饰。在blog.css中增加如下内容:
    ul.blog-info-description {
        list-style: none;
        margin-bottom: 1em;
    
    }
    
    ul.blog-info-description li {
        display: inline-block;
        margin-right: 2em;
    }
    
    div.blog-content {
        text-indent: 2em;
    }