Django的博客项目创建(3)
利用Django实现的功能如下:
- 博客列表显示
- 博客详情页显示
- 博客标签显示
具体实现过程如下:
1.在settings修改模板默认的位置:
TEMPLATES = [{'BACKEND': 'django.template.backends.django.DjangoTemplates',# 'DIRS': [],#相对位置好处在于避免文件夹移动和系统linux或windows改变带来的影响。'DIRS': [os.path.join(BASE_DIR, 'templates')],'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',],},},
]
2.添加模板:
base.html:
{% load staticfiles %}
{% load blog_tags %}
<!DOCTYPE html>
<html>
<head><title>Black & White</title><!-- meta --><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1"><!-- css --><link rel="stylesheet" href="http://code.ionicframework.com/ionicons/2.0.1/css/ionicons.min.css"><link rel="stylesheet" href="{% static 'blog/css/bootstrap.min.css' %}"><link rel="stylesheet" href="{% static 'blog/css/pace.css' %}"><link rel="stylesheet" href="{% static 'blog/css/custom.css' %}"><link rel="stylesheet" href="{% static 'blog/css/highlights/github.css' %}"><!-- js --><script src="{% static 'blog/js/jquery-2.1.3.min.js' %}"></script><script src="{% static 'blog/js/bootstrap.min.js' %}"></script><script src="{% static 'blog/js/pace.min.js' %}"></script><script src="{% static 'blog/js/modernizr.custom.js' %}"></script>
</head><body>
<div class="container"><header id="site-header"><div class="row"><div class="col-md-4 col-sm-5 col-xs-8"><div class="logo"><h1><a href="index.html"><b>Black</b> & White</a></h1></div></div><!-- col-md-4 --><div class="col-md-8 col-sm-7 col-xs-4"><nav class="main-nav" role="navigation"><div class="navbar-header"><button type="button" id="trigger-overlay" class="navbar-toggle"><span class="ion-navicon"></span></button></div><div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1"><ul class="nav navbar-nav navbar-right"><li class="cl-effect-11"><a href="index.html" data-hover="首页">首页</a></li><li class="cl-effect-11"><a href="full-width.html" data-hover="博客">博客</a></li><li class="cl-effect-11"><a href="about.html" data-hover="关于">关于</a></li><li class="cl-effect-11"><a href="contact.html" data-hover="联系">联系</a></li></ul></div><!-- /.navbar-collapse --></nav><div id="header-search-box"><a id="search-menu" href="#"><span id="search-icon" class="ion-ios-search-strong"></span></a><div id="search-form" class="search-form"><form role="search" method="get" id="searchform" action="#"><input type="search" placeholder="搜索" required><button type="submit"><span class="ion-ios-search-strong"></span></button></form></div></div></div><!-- col-md-8 --></div></header>
</div><div class="content-body"><div class="container"><div class="row"><main class="col-md-8">{% block main %}{% endblock main %}</main><aside class="col-md-4">{% block toc %}{% endblock toc %}<div class="widget widget-recent-posts"><h3 class="widget-title">最新文章</h3>{% get_recent_posts as recent_post_list %}<ul>{% for post in recent_post_list %}<li><a href="{{ post.get_absolute_url }}">{{ post.title }}</a></li>{% empty %}暂无文章!{% endfor %}</ul></div><div class="widget widget-archives"><h3 class="widget-title">归档</h3>{% archives as date_list %}<ul>{% for date in date_list %}<li><a href="{% url 'blog:archives' date.year date.month %}">{{ date.year }}年 {{ date.month }} 月</a></li>{% empty %}暂无归档!{% endfor %}</ul></div><div class="widget widget-category"><h3 class="widget-title">分类</h3>{% get_categories as category_list %}<ul>{% for category in category_list %}<li><a href="#">{{ category.name }} <span
class="post-count">(13)</span></a></li>{% empty %}暂无分类!{% endfor %}</ul></div><div class="widget widget-tag-cloud"><h3 class="widget-title">标签云</h3><ul><li><a href="#">Django</a></li><li><a href="#">Python</a></li><li><a href="#">Java</a></li><li><a href="#">笔记</a></li><li><a href="#">文档</a></li><li><a href="#">AngularJS</a></li><li><a href="#">CSS</a></li><li><a href="#">JavaScript</a></li><li><a href="#">Snippet</a></li><li><a href="#">jQuery</a></li></ul></div><div class="rss"><a href=""><span class="ion-social-rss-outline"></span> RSS 订阅</a></div></aside></div></div>
</div>
<footer id="site-footer"><div class="container"><div class="row"><div class="col-md-12"><p class="copyright">© 2017 </p></div></div></div>
</footer><!-- Mobile Menu -->
<div class="overlay overlay-hugeinc"><button type="button" class="overlay-close"><span class="ion-ios-close-empty"></span></button><nav><ul><li><a href="index.html">首页</a></li><li><a href="full-width.html">博客</a></li><li><a href="about.html">关于</a></li><li><a href="contact.html">联系</a></li></ul></nav>
</div><script src="{% static 'blog/js/script.js' %}"></script></body>
</html>
detail.html:
{% extends 'base.html' %}{% block main %}<article class="post post-{{ post.pk }}"><header class="entry-header"><h1 class="entry-title">{{ post.title }}</h1><div class="entry-meta"><span class="post-category"><a href="#">{{ post.category.name }}</a></span><span class="post-date"><a href="#"><time class="entry-date"datetime="{{ post.created_time }}">{{ post.created_time }}</time></a></span><span class="post-author"><a href="#">{{ post.author }}</a></span><span class="comments-link"><a href="#">4 评论</a></span><span class="views-count"><a href="#">588 阅读</a></span></div></header><div class="entry-content clearfix">{{ post.body|safe }}</div></article><section class="comment-area" id="comment-area"><hr><h3>发表评论</h3><form action="#" method="post" class="comment-form"><div class="row"><div class="col-md-4"><label for="id_name">名字:</label><input type="text" id="id_name" name="name" required></div><div class="col-md-4"><label for="id_email">邮箱:</label><input type="email" id="id_email" name="email" required></div><div class="col-md-4"><label for="id_url">网址:</label><input type="text" id="id_url" name="url"></div><div class="col-md-12"><label for="id_comment">评论:</label><textarea name="comment" id="id_comment" required></textarea><button type="submit" class="comment-btn">发表</button></div></div> <!-- row --></form><div class="comment-list-panel"><h3>评论列表,共 <span>4</span> 条评论</h3><ul class="comment-list list-unstyled"><li class="comment-item"><span class="nickname">追梦人物</span><time class="submit-date" datetime="2012-11-09T23:15:57+00:00">2017年3月12日 14:56</time><div class="text">文章观点又有道理又符合人性,这才是真正为了表达观点而写,不是为了迎合某某知名人士粉丝而写。我觉得如果琼瑶是前妻,生了三孩子后被一不知名的女人挖了墙角,我不信谁会说那个女人是追求真爱,说同情琼瑶骂小三的女人都是弱者。</div></li><li class="comment-item"><span class="nickname">zmrenwu</span><time class="submit-date" datetime="2012-11-09T23:15:57+00:00">2017年3月11日 23:56</time><div class="text">本能有可能会冲破格局,但格局有时候也会拘住本能。</div></li><li class="comment-item"><span class="nickname">蝙蝠侠</span><time class="submit-date" datetime="2012-11-09T23:15:57+00:00">2017年3月9日 8:56</time><div class="text">其实真理一般是属于沉默的大多数的。那些偏激的观点只能吸引那些同样偏激的人。前几年琼瑶告于妈抄袭,大家都表示大快人心,说明吃瓜观众都只是就事论事,并不是对琼瑶有偏见。</div></li><li class="comment-item"><span class="nickname">长江七号</span><time class="submit-date" datetime="2012-11-09T23:15:57+00:00">2017年2月12日 12:56</time><div class="text">观点我很喜欢!就是哎嘛本来一清二楚的,来个小三小四乱七八糟一团乱麻夹缠不清,简直麻烦要死</div></li></ul></div></section>
{% endblock main %}
{% block toc %}<div class="widget widget-content"><h3 class="widget-title">文章目录</h3><ul><li><a href="#">教程特点</a></li><li><a href="#">谁适合这个教程</a></li><li><a href="#">在线预览</a></li><li><a href="#">资源列表</a></li><li><a href="#">获取帮助</a></li></ul></div>
{% endblock toc %}
index.html:
{% extends 'base.html' %}{% block main %}{% for post in post_list %}<article class="post post-{{ post.pk }}"><header class="entry-header"><h1 class="entry-title"><a href="{{ post.get_absolute_url }}">{{ post.title }}</a></h1><div class="entry-meta"><span class="post-category"><a href="#">{{ post.category.name }}</a></span><span class="post-date"><a href="#"><time class="entry-date"datetime="{{ post.created_time }}">{{ post.created_time }}</time></a></span><span class="post-author"><a href="#">{{ post.author }}</a></span><span class="comments-link"><a href="#">4 评论</a></span><span class="views-count"><a href="#">588 阅读</a></span></div></header><div class="entry-content clearfix"><p>{{ post.excerpt }}</p><div class="read-more cl-effect-14"><a href="{{ post.get_absolute_url }}" class="more-link">继续阅读 <span class="meta-nav">→</span></a></div></div></article>{% empty %}<div class="no-post">暂时还没有发布的文章!</div>{% endfor %}<!-- 简单分页效果<div class="pagination-simple"><a href="#">上一页</a><span class="current">第 6 页 / 共 11 页</span><a href="#">下一页</a></div>--><div class="pagination"><ul><li><a href="">1</a></li><li><a href="">...</a></li><li><a href="">4</a></li><li><a href="">5</a></li><li class="current"><a href="">6</a></li><li><a href="">7</a></li><li><a href="">8</a></li><li><a href="">...</a></li><li><a href="">11</a></li></ul></div>
{% endblock main %}
3.添加注册模板:
{%block title%}登录页面{%endblock%}{%block content%}<h2>登录页面</h2><form method='post'>{% csrf_token%}{{form.as_p}}<button type='submit'>登录</button></form>
{%endblock%}
4.在post模型中添加获取url的方法:
class Post(models.Model):...def get_absolute_url(self):#blog是url中的命名空间。return reverse('blog:detail' ,kwargs={'pk':self.pk})
5.urls.py中添加命名空间和相关的url:
from django.conf.urls import url
from blog import viewsapp_name='blog'urlpatterns = [url(r'^$', views.index, name='index'),url(r'^(?P<pk>[0-9]+)/$', views.detail, name='detail'),url(r'^archives/(?P<year>[0-9]{4})/(?P<month>[0-9]{1,2})/$', views.archives, name='archives'),]
6.views.py中添加相关的视图函数:
from django.shortcuts import render,get_object_or_404# Create your views here.
from django.http import HttpResponse
from .models import Post
import markdown...
def detail(request, pk):post = get_object_or_404(Post, pk=pk)post.views += 1post.save()post.body = markdown.markdown(post.body,extensions=['markdown.extensions.extra','markdown.extensions.codehilite','markdown.extensions.toc'],)return render(request,'blog/detail.html', context={'post':post})def archives(request, year, month):post_list = Post.objects.filter(created_time__year=year,created_time__month=month).order_by('-created_time')return render(request, 'blog/index.html', context={'post_list':post_list})def category(request, pk):post_list = Post.objects.filter(category_id=pk).order_by('-created_time')return render(request, 'blog/index.html', context={'post_list':post_list})
7.主urls中添加用户登录登出的功能:
from django.conf.urls import url, include
from django.contrib import admin
from django.contrib.auth import views as auth_views
urlpatterns = [url(r'^admin/', admin.site.urls),url(r'^', include('blog.urls')),url(r'^login/$', auth_views.login, name='login'),url(r'^logout/$', auth_views.logout, name='logout'),]
8.在blog.templatetags中添加blog_tags.py:
生成自定义的模板标签,并注册模板标签。
from django import template
from ..models import Post, Categoryregister = template.Library()@register.simple_tag
def get_recent_posts(num=5):return Post.objects.all().order_by('-created_time')[:num]@register.simple_tag
def archives():return Post.objects.dates('created_time', 'month', order='DESC')@register.simple_tag
def get_categories():return Category.objects.all()
Django的博客项目创建(3)相关推荐
- Django day17 博客项目(一)
一: 博客项目需求分析 首页(显示文章) 文章详情 点赞, 点踩 文章评论 字评论 评论的展示 登录功能(图片验证码) 注册功能(基于form验证,ajax) 个人站点(不同人不同样式,文章过滤) 后 ...
- Django之BBS博客项目
一.登陆功能(验证码) 1 from geetest importGeetestLib2 from django.contrib importauth3 4 #使用极验滑动验证码的登陆 5 deflo ...
- Python Web开发:Django+BootStrap实现简单的博客项目
创建blog的项目结构 关于如何创建一个Django项目,请查看[Python Web开发:使用Django框架创建HolleWorld项目] 创建blog的数据模型 创建一个文章类 所有开发都是数据 ...
- 基于Django的博客BBS项目
基于Django的博客BBS项目 项目流程内容概要 第一部分 第二部分 第三部分 第四部分 项目具体流程 1.数据库表创建及同步 1.1创建项目 1.2创建数据库 1.3修改配置文件与__init__ ...
- 利用django+pycharm开发小型博客项目!!!
废话不多说,让我王虎剩大将军带领大家利用djang框架开发一个小型的博客项目吧!! 首先,此教程适合的人群为,懂得创建python的虚拟环境,以及拥有少数web前端开发的经验,并且拥有少数的后端编程经 ...
- 用 Flask 来写个轻博客 (1) — 创建项目
Blog 项目源码:https://github.com/JmilkFan/JmilkFan-s-Blog 目录 目录 前言 扩展阅读 部署开发环境 创建 Github 项目 前言 一步一步的实现一个 ...
- 基于Django的博客系统
代码地址如下: http://www.demodashi.com/demo/14445.html 基于django的博客系统, 界面展示 首页前端界面如下: 文章页面: 后台页面: 文章页面: ##项 ...
- python搭建博客项目思路_Django项目——Blog简易开发入门
一.模型层 模型层是什么 位于视图与数据库之间 pytho对象与数据库表的转换 为什么需要模型层 屏蔽不同数据库之间的差异 开发者更加专注于业务逻辑的开发 提供多种便捷的工具有利于开发工作 模型层的配 ...
- Django 系列博客(二)
Django 系列博客(二) 前言 今天博客的内容为使用 Django 完成第一个 Django 页面,并进行一些简单页面的搭建和转跳. 命令行搭建 Django 项目 创建纯净虚拟环境 在上一篇博客 ...
最新文章
- 关于curl: (2) Failed Initialization
- dojo.publish 和 dojo.subscribe
- 内存中发堆和栈,栈是运行时的单位,而堆是存储的单位
- tkinter显示mysql表_Python(Tkinter)如何只显示Mysql记录而不显示列表?
- socket 远程主机强迫关闭了一个现有的连接_Python 之 后门程序编写与远程控制
- 约瑟夫环c语言代码顺序存储,详解约瑟夫环问题及其相关的C语言算法实现
- 中国大陆收货地址智能解析API
- 2018年中国互联网企业百强榜单揭晓
- 宏观经济学通识课-读书笔记
- 思科路由器配置命令(三)
- video.js插件的使用
- Quartus prime工程中各种文件的后缀及意义
- LBM学习记录4 Python实现D3Q19圆柱绕流
- 【3dsmax插件】FBX转Bip插件 Bippy.ms
- 计算机控制面板设置命令,控制面板在哪?控制面板命令,5种控制面板快速打开法...
- Siebel应用数据结构层次
- diamond源码解析
- python turtle笛卡尔心形线_用MATLAB实现心形线
- 疫情当下,选择代理加盟互联网广告项目的优势
- Model Adaption: Unsupervised Domain Adaption Without Source Data
热门文章
- 如何实现PLC远程编程调试上下载更改程序
- 使用Yalmip+matlab求解主从博弈(双层规划)问题 | 教程(二)
- 携程反爬中的Eleven参数-反爬与反反爬的奇技淫巧
- 广西玉林2021年高考成绩查询,2021年广西高考县中实力榜 玉林中学超群
- 【Adobe Illustrator 教程】2. 认识矩形工具并绘制一些马赛克图案
- python traceback对象_Traceback具体使用方法
- VScode代码格式化解决方案c/c++
- java怎么加工具栏_Java入门-考无忧教你添加工具栏
- mysql: [MY-010055] [Server] IP address ‘10.237.0.196‘ could not be resolved
- Word键入自动将单双引号修改为弯引号(‘‘或““)