Django搭建个人博客平台6---前端templates模板index页

文章目录

Django搭建个人博客平台6—前端templates模板index页

Django的template模板渲染官方文档:官方文档

大家可以去模板网站上找一下自己喜欢网站,参照它的样式布局,也可以参照我的,不要怕,互联网本就是个开源平台,互相借鉴才能提高。

base页面

页面总体布局。模板继承,我们先写一个基础页面,预留好block钩子。以后其他页面均可以继承此页面,根据预留的钩子进行二次布局。

base.html页面整体布局,预留title meta css js navigation content aside footer钩子,一边页面继承时扩展。

引用bootstrap样式进行页面布局

静态文件建议目录结构

static----------------
	js----------------存放js
	css---------------存放css
	images------------存放图片
	plugins-----------使用的插件

base.html

{% load static %}
<!DOCTYPE html>
<html lang="en">
<head>
    <!-- Required meta tags -->
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
    <link type="text/plain" rel="author" href="{% static 'human.txt' %}"/>

    <title>
        {% block title %}
    		大聪明的个人博客
        {% endblock %}
    </title>

    {% block meta %}
        <meta name="description" content="大聪明博客平台,主要学习django,java,Spring,python">
        <meta name="keywords" content="大聪明博客平台,django,java,Spring,python">
    {% endblock %}


    {% block css %}

    {% endblock %}


</head>

<body>
{% block Navigation %}
    <!--导航条-start-->

    <!--导航条-end-->
{% endblock %}



<!--主内容-start--->
<main role="main">

    <!--上小半部分start--->
    <div style="position:relative;">

    </div>
    <!--上小半部分end--->


    {% block content %}
        <!--主内容-start--->

        <!--左边内容区-start-->
        <p>内容</p>
        <!--左边内容区-end-->

        <!--分页栏-start-->
        <!--分页栏-end-->
    {% endblock %}


    {% block aside %}

        <!--侧边栏-start-->

        <!--侧边栏-end-->
    {% endblock %}


    <!--主内容-end--->


</main>

<footer>
    
    {% block footer %}
    {% endblock %}
    
</footer>
    
    {% block js %}
    {% endblock %}
    
</body>

</html>

index首页

index.html继承base.html,博客首页。

Django搭建个人博客平台6---前端templates模板index页

自定义Navigation导航栏inclusion_tag

自定义标签和控制器方法介绍

自定义过滤器
1. app应用文文件夹中创建templatetags文件夹,必须是这个名字;
2. templatetags文件夹中创建一个xx.py文件,名字可以随便起。
3. 创建自定义过滤器
	from django import template

    register = template.Library()  # register固定的名字

    @register.filter
    def test(v1, v2):
        # 带参数
        s = v1 + v2
        return s

    @register.filter
    def xxoo(v1):
        # 不带参数
        s = v1 + 'xxoo'
        return s
4. 使用 html文件中的 {%  load 文件名  %}
    {% load te %}
    {#不带参数#}
    {{ s1|xxoo  }}
    {#带参数#}
    {{ s1|test:'幸福的生活在一起!' }}
5. 注意:参数最多两个。
        
自定义标签
1. app应用文文件夹中创建templatetags文件夹,必须是这个名字;
2. templatetags文件夹中创建一个xx.py文件,名字可以随便起。    
3. 创建自定义过滤器
	from django import template

    register = template.Library()  # register固定的名字
    @register.simple_tag
    def mytag(v1):
        s = v1 + '男枪'
        return s

    @register.simple_tag
    def mytag2(v1, v2, v3):
        s = v1 + v2 + v3
        return s
4. 使用 html文件中的 {%  load 文件名  %}
    {% load te %}
    <h>
        {% mytag s1 %}
        {% mytag2 s1 '寒冰' '卡特' %}
    </h> 
5. 注意:参数可以有多个。        

inclusion_tag

xx.py
from django import template

register = template.Library()  # register固定的名字
@register.inclusion_tag('includetag.html')
def func():
    return {'data':['人马','提莫','龙龟']}
test.html
<ul>
    {% for d in data %}
      <li>{{ d }}</li>
    {% endfor %}
</ul>
作为一个组件在xxoo.html中使用
{% load te %}
{% func %}

导航栏inclusion_tag

  1. app应用文文件夹中创建templatetags文件夹,必须是这个名字;

  2. templatetags文件夹中创建一个custom_tag.py文件,名字可以随便起。

  3. 在 custom_tag.py文件中定义

    from django import template
    
    register = template.Library()
    
    
    @register.inclusion_tag('navigation.html')
    def navigation(categories, cur_user_name, columns):
        return {'categories': categories, 'cur_user_name': cur_user_name, 'columns': columns, }
    
  4. 在templates文件夹中新建一个navigation.html,渲染的数据就是def navigation传来的数据,就是要展示的专栏和分类数据。

    <header>
        <nav class="navbar fixed-top navbar-expand-xl navbar-light t-navigation">
                <ul class="navbar-nav mr-auto mt-2 mt-lg-0">
                    {% for column in columns %}
                        {% if column.is_tree %}
                           	xxx
                                    {% for category in categories %}
                                        {% if category.column.id == column.id %}
                                            xxx
                                        {% endif %}
                                    {% endfor %}                           
                        {% else %}
                            {% if column.is_site %}
                              xxx
                                {% else %}
                           			xxx
                                {% endif %}
                        {% endif %}
                    {% endfor %}
                </ul>
            {% if cur_user_name %}
                <a class="btn btn-outline-success my-2 my-sm-0 ml-lg-2" type="button" href="{% url 'logout' %}">登出</a>
            {% else %}
                <a class="btn btn-outline-success my-2 my-sm-0 ml-lg-2" type="button" href="{% url 'login' %}">登陆</a>
            {% endif %}
        </nav>
    </header>
    
  5. index.html中使用,这样在哪里要加导航栏直接把它放在那就行啦

    {% extends 'base.html' %}
    {% load static %}
    {% load custom_tag %}
    
    {% block css %}
        <link rel="stylesheet" href="{% static 'css/hint.css' %}">
    {% endblock %}
    

index.html

由于样式太多,这里只教学后台render过来的数据渲染。

footer脚注我是直接写在了base里面,因为这个一次配置后不会在改。如果你们想和重写这个钩子,可以类似玉导航栏页封装一下。建议自己动手实现一下。

{% extends 'base.html' %}
{% load static %}
{% load custom_tag %}

{% block title %}
    {{ admin_obj.username }}的个人博客
{% endblock %}

{% block css %}
    <link rel="stylesheet" href="{% static 'css/hint.css' %}">
{% endblock %}

{## 导航条使用:1.加载自定义标签;2.使用block;3.views.py传入#}
{% block Navigation %}
    {% navigation categories cur_user_name columns %}
{% endblock %}


{% block content %}
    <!--主内容-start--->

    <!--左边内容区-start-->
        <p>对render来的文章对象的queryset用for遍历渲染</p>
    <!--左边内容区-end-->

    <!--分页栏-start-->
		可以先不考虑分页,封装的分页组件渲染,下一节会讲。
		{{ page_html }}
    <!--分页栏-end-->
{% endblock %}


{% block aside %}

    <!--侧边栏-start-->
		侧边栏数据的渲染和样式
    <!--侧边栏-end-->
{% endblock %}

后话

我的博客目前正常运行,这是我自己建立博客网站的记录和总结。如果你按照我的教程去做,一般是不会出现问题 ,但是,总会有bug发生。如果你遇到了问题,欢迎与我交流沟通。

最后,如果你觉得这篇文章对你有用的话,欢迎一键三连酌情打赏,谢谢!

上一篇:gazebo plugin


下一篇:[考试总结]noip模拟77