Django搭建博客网站(三)
Django搭建博客网站(三)
第三篇主要记录view层的逻辑和template.
结构
网站结构决定我要实现什么view.
我主要要用view展示首页,标签页,网站管理员(也就是本人啦)信息页,以及文章详情页.
settings.py
因为到这个阶段需要编写html文件了,但是每一个网页的每一行代码都靠自己去写,各种渲染也靠自己去写的话,太麻烦了,Django提供了html模板功能,可以在settings.py里面进行配置.
# settings.py
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
},
]
其实在python的众多package里面还有一个叫Jinja2的模块,也是实现html模板功能,不过这里我觉得没必要改成Jinja2,Django本身提供的模板功能已经够用了.
首先创建一个母模板base.html,不过在创建模板之前还需要在post下面创建个templates文件夹专门用来放html模板,这个是必须操作,因为在view的方法里面对模板进行引用时,Django只会在这个叫templates的文件夹下面找模板.然后在templates文件夹下面创建一个post文件夹,post这个app的模板就放在这里面了.
<!-- post/base.html -->
{% load static %}
<head>
<link rel="stylesheet" type="text/css" href="{% static 'bootstrap/css/bootstrap.min.css' %}"
integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous">
{% block title %}<title></title>{% endblock %}
</head>
{% block body %}
{% block navbar %}
<nav class="navbar navbar-inverse">
<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="{% url 'post:index' %}">Chain</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="{% url 'post:index' %}">Home<span class="sr-only">(current)</span></a></li>
<li><a href="{% url 'post:user' 'chain'%}">Profile</a></li>
</ul>
</div>
</div>
</nav>
{% endblock %}
{% block content %}
{% endblock %}
{% endblock %}
没错了,base.html使用了Bootstrap,在第一篇文章做准备工作时就已经将Bootstrap的资源放到了static文件夹下面,所以你这里先加载了static文件夹,紧接着就对bootstrap进行导入.
base.html只是给网站固定实现了一个导航栏,后面每一个继承了这个模板的html模板都会有这个模板,而不需要再把导航栏的代码重写一遍.
可以看到,base.html里面定义了两个block,我们后面写的子模板就是要在content这个block里面写我们想展示的内容.
再看,在导航栏的代码里面有一些可点击的链接,href属性都是用的模板的url方法动态生成的,具体怎么生成就不说了,拿url 'post:user' 'chain'举例说明一下:
url是模板功能提供的处理url的方法post:user可以在post的urls.py里面找到相对应的,post是在urls.py里面的app_name属性,user肯定就是urls.py里面注册url地址时设置的name属性.chain,这个只是传到view层的一个参数而已.
具体的.在实现view逻辑的时候就明白了.
View
首页
首页主要是展示文章列表以及一个历史标签列表.
先从数据库获取所有的文章整合到一个list里面传到html进行显示.同样的,要获取标签列表也是一样的方法.
# post/views.py
class IndexView(generic.TemplateView):
template_name = 'post/index.html'
def get_context_data(self, **kwargs):
context=super().get_context_data(**kwargs)
context['posts']=Post.objects.all()[:3]
context['tags'] = PostTag.objects.all()
return context
def tag(request,tag_name):
tags = PostTag.objects.filter(tag_name=tag_name)
posts = tags[0].post_set.all()
return render(request,'post/tag_index.html',{'posts':posts,'tag_name':tag_name})
对于view逻辑的实现,可以定义一个方法,也可以定义一个类,其实定义成类的话,比定义成方法要好很多,但是因为还不是很熟悉View的各种基类,就先大部分用定义方法的方式了.
在templates/post文件夹下面创建index.html和tag_index.html:
<!-- index.html -->
{% extends 'post/base.html' %}
{% block title %}
<title>Chain's Blog</title>
{% endblock %}
{% block content %}
{% if not posts %}
<div class="container">
<div class="page-header" align="center">
<h1>欢迎来到Chain的博客网站!!!</h1>
</div>
<div align="center">
<h1>Chain don't have blog....Sorry...</h1>
</div>
</div>
{% else %}
<div class="container">
<div class="page-header" align="center">
<h1>欢迎来到Chain的博客网站!!!</h1>
</div>
<div class="col-md-6">
<ul class="list-group">
{% for post in posts %}
<li class="list-group-item" style="box-shadow: 5px 5px 5px #3c3c3c">
<div>
<a href="{% url 'post:post' post.id %}" style="color: black;text-decoration: none">
<h2>{{ post.post_title }}</h2></a>
</div>
<hr>
<div>
<h4>{{ post.post_description }}</h4>
</div>
<br>
<a class="btn btn-success" href="{% url 'post:post' post.id %}">查看全文
</a>
</li>
<br>
{% endfor %}
</ul>
</div>
<div class="col-md-6">
<div class="col-md-4">
</div>
{% if tags %}
<div class="col-md-4" style="box-shadow: 5px 5px 5px #3c3c3c">
<h3>History Tags</h3>
<ul class="list-group">
{% for tag in tags %}
<a href="{% url 'post:tag' tag.tag_name %}" style="text-decoration: none">
<li class="list-group-item"># {{ tag.tag_name }}</li>
</a>
{% endfor %}
</ul>
</div>
{% endif %}
</div>
<div class="col-md-4"></div>
</div>
{% endif %}
{% endblock %}
<!-- tag_index.html -->
{% extends 'post/base.html' %}
{% block title %}
<title>Tag:{{ tag_name }}</title>
{% endblock %}
{% block content %}
<div class="col-md-3"></div>
<div class="container col-md-6">
<div class="page-header"><h1 align="center"># {{ tag_name }}</h1></div>
<ul class="list-group">
{% for post in posts %}
<li class="list-group-item" style="box-shadow: 5px 5px 5px #3c3c3c">
<div>
<a href="{% url 'post:post' post.id %}" style="color: black;text-decoration: none">
<h2>{{ post.post_title }}</h2></a>
</div>
<hr>
<div>
<h4>{{ post.post_description }}</h4>
</div>
<br>
<a class="btn btn-success" href="{% url 'post:post' post.id %}">查看全文
</a>
</li>
<br>
{% endfor %}
</ul>
</div>
<div class="col-md-3"></div>
{% endblock %}
可以看见两个模板都继承了base.html,因为在base.html里面已经引入了Bootstrap,所以这里可以直接使用Bootstrap对页面进行渲染.
其他的页面的实现,和首页差不多,只不过在文章详情页面为了加入Markdown有些小细节要注意,下一篇文章再做详细解释.
完章项目已经push到我的github上面.
Django搭建博客网站(三)的更多相关文章
- Django搭建博客网站(四)
Django搭建博客网站(四) 最后一篇主要讲讲在后台文章编辑加入markdown,已经在文章详情页对markdown的解析. Django搭建博客网站(一) Django搭建博客网站(二) Djan ...
- Django搭建博客网站(二)
Django搭建自己的博客网站(二) 这里主要讲构建系统数据库Model. Django搭建博客网站(一) model 目前就只提供一个文章model和一个文章分类标签model,在post/mode ...
- Django搭建博客网站(一)
Django搭建自己的博客网站(一) 简介 这个系列主要是通过使用Django这个python web框架实现一个简单的个人博客网站.对Django有疑问可以上Django官网查文档. 功能 后台管理 ...
- 使用django搭建博客并部署
2017/8/31 18:27:59 为了以后参考的方便,在这里总结一下django搭建博客网站的主要步骤.以下大部分的内容,参考自Django中文文档 - 看云. 需要强调的是,这里使用的djang ...
- 手把手教从零开始在GitHub上使用Hexo搭建博客教程(三)-使用Travis自动部署Hexo(1)
前言 前面两篇文章介绍了在github上使用hexo搭建博客的基本环境和hexo相关参数设置等. 基于目前,博客基本上是可以完美运行了. 但是,有一点是不太好,就是源码同步问题,如果在不同的电脑上写文 ...
- Django搭建博客记(一)
这里记录一些 Django 搭建博客遇到的一些问题 参考书籍为 Django by Example, 这里记录与书籍内容不包含的内容. 搭建环境: 阿里云 ECS + CentOS7 一开始搭建的时候 ...
- Hexo系列(一) 搭建博客网站
写在前面的话:本系列文章主要参考 Hexo官方说明文档,同时结合自己在使用过程中的一些心得体会,撷取下来,和大家分享分享.好,下面闲话不多说,马上开始我们的 Hexo 之旅吧 温馨提醒:博主使用的操作 ...
- hexo搭建博客系列(三)美化主题
文章目录 其他搭建 1. 添加博客图标 2. 鼠标点击特效(二选一) 2.1 红心特效 2.2 爆炸烟花 3. 设置头像 4. 侧边栏社交小图标设置 5. 文章末尾的标签图标修改 6. 访问量统计 7 ...
- Django 系列博客(三)
Django 系列博客(三) 前言 本篇博客介绍 django 的前后端交互及如何处理 get 请求和 post 请求. get 请求 get请求是单纯的请求一个页面资源,一般不建议进行账号信息的传输 ...
随机推荐
- BLE空中升级 谈(二)
BLE 空中升级谈 -- CC2541 的产品开发中OAD注意事项(续) TI CC2541支持多个硬件,多个软件对它进行空中升级,可以有不同的组合,硬件有 编号 名称 Hex 用法 1 Cc2540 ...
- 番外篇--Moddule Zero启动模板
1.3 ABPZero - 启动模板 1.3.1 简介 使用ABP和moudle-zero开始一个新项目的最简单的方式是在模板页创建模板.记住要勾选 Include module zero. 在创建并 ...
- 学习JVM-GC收集器
1. 前言 在上一篇文章中,介绍了JVM中垃圾回收的原理和算法.介绍了通过引用计数和对象可达性分析的算法来筛选出已经没有使用的对象,然后介绍了垃圾收集器中使用的三种收集算法:标记-清除.标记-整理.标 ...
- 提交到svn服务器时,一直缓冲不,
1,服务器端url问题,正常:https://192.168.1.102:8443/svn/dedegls/ 错误:https:// ...
- 面试官最爱的volatile关键字
在Java相关的岗位面试中,很多面试官都喜欢考察面试者对Java并发的了解程度,而以volatile关键字作为一个小的切入点,往往可以一问到底,把Java内存模型(JMM),Java并发编程的一些特性 ...
- CC2650LaunchPad 运行contiki hello-world示例程序
最近做毕设,开始接触contiki. 下载并运行Instant Contiki 3.0 这是官方制作的虚拟机镜像,直接用vmware等工具就可以运行. 从这里下载. 下载并解压后,用vmware运行. ...
- Python调用外部程序——os.system()和subprocess.call
通过os.system函数调用其他程序 预备知识:cmd中打开和关闭程序 cmd中打开程序 a.打开系统自带程序 系统自带的程序的路径一般都已加入环境变量之中,只需在cmd窗口中直接输入程序名称即可. ...
- 【js 实践】js 实现木桶布局
还有两个月左右就要准备实习了,所以特意练一练,今天终于搞定了js 的木桶布局了 这一个是按照一个插件的规格去写的以防以后工作需要,详细的解释在前端网这里 http://www.qdfuns.com/n ...
- jquery checkbox 全选反选代码只能执行一遍,第二次就失败
遇到问题背景: 在写到购物车的全选交互的时候,商品选中的状态只有在第一次的时候可以,第二次就无法选中:(代码如下) $(".chooseall").click(function() ...
- Redis进阶实践之七Redis和Lua初步整合使用
一.引言 Redis学了一段时间了,基本的东西都没问题了.从今天开始讲写一些redis和lua脚本的相关的东西,lua这个脚本是一个好东西,可以运行在任何平台上,也可以嵌入到大多数语言当 ...