Django博客开发-数据建模与样式设定
开发流程介绍
之前Django的学习过程当中已经把基本Django开发学完了,现在以Django 的博客项目完成一遍课程的回顾和总结。同时来一次完整开发的Django体验。
一个产品从研究到编码我们要经历以下的过程:
博客开发需求分析与建模
需求分析
本次项目完成的是一个博客的项目,博客主要目的是为了分享个人的技术,进行技术积累。
主要是发布文章日志。但是也需要有评论和互动。需要完成以下功能点:
1、文章的发布、展示、修改、删除。
2、文章评论
3、读者互动
4、图片管理
概要设计
我们对上面的四个需求进行详细的分析
1、文章的发布、展示、修改、删除。
文章发布、修改和删除,我们可以通过Django的admin后台完成,当然也可以自己定义或者用三方的后台比如xadmin,这个可以作为版本迭代的一个方向。
但是在开始的开发过程当中,我们着重要做的就是展示功能,文章展示通常分为以下几个技术点:
1、文章列表页
按类型划分
搜索
分页
2、文章详情页
文章排版
2、文章评论
1、评论发布
2、评论回复
3、读者互动
提供个人联系方式
4、图片管理
1、文章图片展示管理
2、照片展示管理
完成分析之后,开始创建Django项目
开发版本:
Python 3.5
Django 1.8.2
pillow 模块 pip3 install pillow
django-ckeditor 模块 pip3 install django-ckeditor
Pycharm
1、创建项目
命令:django-admin startproject OurBlog
2、切入项目,创建功能,app
命令:python manage.py startapp Article
3、创建模板和静态文件存放的位置
4、安装上述依赖模块
注:如果是和我一样python2和python3都安装在一个系统下的话,就用pip3,否则用pip就可以
命令:pip3 install pillow
命令:pip3 install django-ckeditor
数据建模
数据建模:数据建模就是用数据库描述上面分析的博客需求,然后形成对应的表和关系,数据建模是web开发至关总要的一个环节,一个优秀的模型是web开发成功的一 大半。
通常的web开发会使用数据库语句,在数据库当中搭建模型,这样开发很直观,但是无疑增加了开发的难度,Django采用的是orm(数据库映射)用Python类描述数据 库,然后通过orm将描述映射到数据当中。Django的模型文件是应用(APP)的models.py
OurBlog/Article/models.py
from django.db import models
from ckeditor_uploader.fields import RichTextUploadingField class Author(models.Model):
gender_choice = (
("M","Male"),
("F","Female"),
)
name = models.CharField(max_length = 32,verbose_name = "作者姓名")
age = models.IntegerField(verbose_name = "作者年龄",blank = True,null = True)
gender = models.CharField(max_length = 2,choices = gender_choice,verbose_name = "作者性别",blank = True,null = True)
email = models.EmailField(verbose_name = "作者邮箱",blank = True,null = True)
phone = models.CharField(max_length = 11,verbose_name = "作者电话",blank = True,null = True)
photo = models.ImageField(verbose_name = "作者头像",upload_to = "images/author") def __str__(self):
return "作者:%s"%self.name class Classify(models.Model):
label = models.CharField(max_length = 32,verbose_name = "分类标签")
description = models.TextField(verbose_name = "分类描述") def __str__(self):
return "标签:%s" % self.label class Comment(models.Model):
content = RichTextUploadingField(verbose_name = "评论内容")
content_name = models.CharField(max_length = 32,verbose_name = "评论用户")
agree = models.IntegerField(verbose_name = "评论点赞")
time = models.DateTimeField(verbose_name = "评论时间") def __str__(self):
return "[%s] 评论: %s"%(self.content_name,self.content) class Picture(models.Model):
label = models.CharField(max_length = 32, verbose_name = "图片标签")
image = models.ImageField(verbose_name = "图片链接", upload_to = "images/picture")
description = RichTextUploadingField(verbose_name = "图片描述") classify = models.ForeignKey(to = Classify, verbose_name = "图片分类")
commant = models.ForeignKey(to = Comment, verbose_name = "图片评论") def __str__(self):
return "图片名称: %s" % self.label class Article(models.Model):
"""
一篇文章可以有一个作者,一个作者可以以有一篇文章,
一篇文章有多条评论
一个文章有多个分类
一个分类有多篇文章
"""
title = models.CharField(max_length = 32,verbose_name = "文章标题")
time = models.DateField(verbose_name = "文章发表日期")
description = RichTextUploadingField(verbose_name = "文章描述")
content = RichTextUploadingField(verbose_name = "文章内容") picture = models.ImageField(verbose_name = "文章图片",upload_to = "images/article")
author = models.ForeignKey(Author)
classify = models.ManyToManyField(Classify)
commant = models.ForeignKey(to=Comment, verbose_name="文章评论", blank = True,null = True) #文章可以有评论,也可以没有 def __str__(self):
return "文章:%s" % self.title
完成模型的定义之后,接着进行项目的配置的修改
OurBlog/OurBlog/settings.py
1 #……
2 # Application definition
3 #安装功能
4 INSTALLED_APPS = (
5 'django.contrib.admin',
6 'django.contrib.auth',
7 'django.contrib.contenttypes',
8 'django.contrib.sessions',
9 'django.contrib.messages',
10 'django.contrib.staticfiles',
11 'Article', #我们自定义的功能
12 'ckeditor', #Django ckeditor的功能
13 'ckeditor_uploader', #Django ckeditor的上传功能
14 )
15 #.......
16 #模板配置
17 TEMPLATES = [
18 {
19 'BACKEND': 'django.template.backends.django.DjangoTemplates',
20 'DIRS': [
21 os.path.join(BASE_DIR,'template') #模板配置
22 ],
23 'APP_DIRS': True,
24 'OPTIONS': {
25 'context_processors': [
26 'django.template.context_processors.debug',
27 'django.template.context_processors.request',
28 'django.contrib.auth.context_processors.auth',
29 'django.contrib.messages.context_processors.messages',
30 ],
31 },
32 },
33 ]
34
35 WSGI_APPLICATION = 'OurBlog.wsgi.application'
36
37
38 # Database
39 # https://docs.djangoproject.com/en/1.8/ref/settings/#databases
40 #数据库配置,默认使用sqllite数据库
41 DATABASES = {
42 'default': {
43 'ENGINE': 'django.db.backends.sqlite3',
44 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
45 }
46 }
47
48
49 # Internationalization
50 # https://docs.djangoproject.com/en/1.8/topics/i18n/
51 #语言和时区配置
52 LANGUAGE_CODE = 'zh-hans' #项目语言为中文
53
54 TIME_ZONE = 'Asia/Shanghai' #调整为东8区时间,上海时间
55
56 USE_I18N = True
57
58 USE_L10N = True
59
60 USE_TZ = False #禁止采用0时区时间
61
62
63 # Static files (CSS, JavaScript, Images)
64 # https://docs.djangoproject.com/en/1.8/howto/static-files/
65
66 #静态文件配置
67 STATIC_URL = '/static/'
68 STATICFILES_DIRS = (
69 os.path.join(BASE_DIR,"static").replace("\\","/"),
70 )
71 STATIC_ROOT = os.path.join(BASE_DIR,"static/ckeditor").replace("\\","/")
72
73 #媒体文件配置 我们上传图片使用
74 MEDIA_URL = "/media/"
75 MEDIA_ROOT = os.path.join(BASE_DIR,"static").replace("\\","/")
76
77 #ckeditor配置
78 CKEDITOR_UPLOAD_PATH = 'uploads/' #上传路径
79 CKEDITOR_IMAGE_GACKEND = 'pillow' #上传图片用的模块
然后进行ckeditor的路由指出。
OurBlog/OurBlog/urls.py
from django.conf.urls import include, url
from django.contrib import admin urlpatterns = [
#......
url(r'^ckeditor/', include('ckeditor_uploader.urls')),
]
进行模型后台的安装
OurBlog/Article/admin.py
from django.contrib import admin
from Article.models import Article,Author,Classify,Picture,Comment class ArticleAdmin(admin.ModelAdmin):
search_fields = ["title","time"] #添加搜索选项 admin.site.register(Article,ArticleAdmin)
admin.site.register(Author)
admin.site.register(Classify)
admin.site.register(Picture)
admin.site.register(Comment)
# Register your models here.
进行数据库的同步
1、校验配置是否正确
命令: python manage.py validate
2、生成数据库语句
命令: python manage.py makemigrations
3、完成数据库同步
命令: python manage.py syncdb
创建超级用户
注:只有在第一次同步数据库才会出现创建超级用户的选项,创建的是Django自带后台的超级用户,密码默认不显示,填写时候要小心
然后进行静态文件的收集
命令: python manage.py collectstatic
博客样式加载,模板渲染
上面的步骤完成之后,我们就可以进行页面的编写,加载,和渲染了,在工作当中,除非是个人项目,一般情况下,当进行Django开发的时候,前台的页面也就具备了。在这个项目当中,我们采用一个准备好的模板进行演示:
1、模板渲染的第一步,是打开模板文件,进行页面特征的查看,对结构相同的页面构建base结构。我们课上演示的是一款中国风格的博客模板,当然,大家也可以自 己定义或者下载自己喜欢的模板。(模板地址:链接:https://pan.baidu.com/s/1P2h8qwUcVoVA9R74nEm_pA 提取码:27x8 注:该模板不是作者开发,用于联系如 果盈利,请联系原作者 )
模板文件如下:
比对四个页面的效果发现:
顶部:
尾部:
效果一样。所以根据这个我们搭建自己的base页面。在这里要注意的是这套模板的编码是gb2312,我们需要进行修改。修改完成定制base页面
首先将静态文件迁入项目的static目录
然后根据前端样式分析,编写base.html(手生的同学可以复制一个页面过来,进行修改)
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>
{% block title %}
while 个人博客
{% endblock %}
</title>
<meta name="keywords" content="while 个人博客" />
<meta name="description" content="while 个人博客" />
<link href="/static/css/base.css" rel="stylesheet">
<link href="/static/css/index.css" rel="stylesheet">
<!--[if lt IE 9]>
<script src="/static/js/modernizr.js"></script>
<![endif]-->
<script type="text/javascript" src="/static/js/jquery.js"></script>
{% block style %}
{% endblock %}
</head>
<body> <div id="wrapper">
<header>
<div class="headtop"></div>
<div class="contenttop">
<div class="logo f_l">大泽九章--个人博客</div>
<div class="search f_r">
<form action="/e/search/index.php" method="post" name="searchform" id="searchform">
<input name="keyboard" id="keyboard" class="input_text" value="请输入关键字" style="color: rgb(153, 153, 153);" onfocus="if(value=='请输入关键字'){this.style.color='#000';value=''}" onblur="if(value==''){this.style.color='#999';value='请输入关键字'}" type="text">
<input name="show" value="title" type="hidden">
<input name="tempid" value="" type="hidden">
<input name="tbname" value="news" type="hidden">
<input name="Submit" class="input_submit" value="搜索" type="submit">
</form>
</div>
<div class="blank"></div>
<nav>
<div class="navigation">
<ul class="menu">
<li><a href="/index/">网站首页</a></li>
<ul>
<li><a href="bf/about.html">个人简介</a></li>
<li><a href="bf/listpic.html">个人相册</a></li>
</ul>
</li>
<li><a href="/Article/myBlog/">我的博客</a>
<ul>
<li><a href="bf/newslistpic.html">个人博客</a></li>
<li><a href="bf/newslistpic.html">技术博客</a></li>
</ul>
</li>
<li><a href="/Article/myPicture/">我的照片</a></li>
<li><a href="/aboutMe/">关于我</a>
<li><a href="#">给我留言</a> </li>
</ul>
</div>
</nav>
<SCRIPT type=text/javascript>
// Navigation Menu
$(function() {
$(".menu ul").css({display: "none"}); // Opera Fix
$(".menu li").hover(function(){
$(this).find('ul:first').css({visibility: "visible",display: "none"}).slideDown("normal");
},function(){
$(this).find('ul:first').css({visibility: "hidden"});
});
});
</SCRIPT>
</div>
</header>
{% block content %} {% endblock %}
<footer>
<div class="footer">
<div class="f_l">
<p>All Rights Reserved 版权所有:<a href="http://www.yangqq.com">while 个人博客</a> 备案号:蜀ICP备00000000号</p>
</div>
<div class="f_r textr">
<p>let's say hello world</p>
</div>
</div>
</footer>
</div>
</body>
</html>
然后开始继承base模板开始定义指出页面
首先定义视图文件
from django.shortcuts import render def base(request):
return render(request,"base.html") def index(request):
return render(request,"index.html") def myArticle(request):
return render(request,"myArticle.html") def myPicture(request):
return render(request,"myPicture.html") def aboutMe(request):
return render(request,"aboutMe.html") def connectMe(request):
return render(request,"aboutMe.html")
然后进行继承,完成基本的样式修改,我们以aboutMe页面为例
{% extends "base.html" %} {% block title %}
关于我们
{% endblock %} {% block style %}
<link href="/static/css/main.css" rel="stylesheet">
{% endblock %} {% block content %}
<div class="container">
<div class="con_content">
<div class="about_box">
<h2 class="nh1"><span>您现在的位置是:<a href="/" target="_blank">网站首页</a>>><a href="#" target="_blank">信息浏览</a></span><b>个人简介</b></h2>
<div class="f_box">
<p class="a_title">个人简介</p>
<p class="p_title"></p>
<!-- <p class="box_p"><span>发布时间:2017-07-07 15:12:42</span><span>作者:唐孝文</span><span>来源:稽查支队</span><span>点击:111056</span></p>-->
<!-- 可用于内容模板 -->
</div>
<ul class="about_content">
<p> 人生就是一个得与失的过程,而我却是一个幸运者,得到的永远比失去的多。生活的压力迫使我放弃了轻松的前台接待,放弃了体面的编辑,换来虽有些蓬头垢面的工作,但是我仍然很享受那些熬得只剩下黑眼圈的日子,因为我在学习使用Photoshop、Flash、Dreamweaver、ASP、PHP、JSP...中激发了兴趣,然后越走越远....</p>
<p><img src="/static/images/01.jpg"></p>
<p>“冥冥中该来则来,无处可逃”。 </p>
</ul> </div>
</div>
<div class="blank"></div>
</div>
<!-- container代码 结束 -->
{% endblock %}
接着完成路由指出
from django.conf.urls import include, url
from django.contrib import admin
from Article.views import * urlpatterns = [
url(r'^admin/', include(admin.site.urls)),
url(r'^ckeditor/', include('ckeditor_uploader.urls')),
url(r'^ckeditor/', include('ckeditor_uploader.urls')),
url(r'^index/', index),
url(r'^myArticle/', myArticle),
url(r'^myPicture/', myPicture),
url(r'^aboutMe/', aboutMe),
url(r'^connectMe/', connectMe),
]
最后通过base页完成前端路由的修整,这样,我们的网站就可以点进选择了。
<!--……-->
<ul class="menu">
<li><a href="/index/">网站首页</a></li>
<ul>
<li><a href="/aboutMe/">个人简介</a></li>
<li><a href="/myPicture/">个人相册</a></li>
</ul>
</li>
<li><a href="/myArticle/">我的博客</a>
<ul>
<li><a href="/myArticle/">个人博客</a></li>
<li><a href="/myArticle/">技术博客</a></li>
</ul>
</li>
<li><a href="/myPicture/">我的照片</a></li>
<li><a href="/aboutMe/">关于我</a>
<li><a href="/aboutMe/">给我留言</a> </li>
</ul>
</div>
</nav>
<SCRIPT type=text/javascript>
<!--……-->
这样,我们就完成了最基本的前端效果。然后就可以在后台添加数据,进行数据的基本调用了
Django博客开发-数据建模与样式设定的更多相关文章
- Django 博客开发教程目录索引
Django 博客开发教程目录索引 本项目适合 0 基础的 Django 开发新人. 项目演示地址:Black & White,代码 GitHub 仓库地址:zmrenwu/django-bl ...
- Django博客开发实践,初学者开发经验
python,Django初学者,开发简易博客,做了一下笔记,记录了开发的过程,功力浅薄,仅供初学者互相 交流,欢迎意见建议.具体链接:Django博客开发实践(一)--分析需求并创建项目 地址:ht ...
- Django博客开发教程,Django快速开发个人blog
学DjangoWEB框架,估计大部分的朋友都是从Blog开发开始入门的,Django中文网发布了一个Django开发教程,这个教程简单易懂,能让你快速的使用Django开发一个漂亮的个人blog,是D ...
- django博客开发
找一文件夹作为项目文件夹1 django-admin.py startproject mysite建立工程2 cd mysite python manage.py startapp blog 建立第一 ...
- django博客项目5:博客首页视图(2)
真正的 Django 博客首页视图 在此之前我们已经编写了 Blog 的首页视图,并且配置了 URL 和模板,让 Django 能够正确地处理 HTTP 请求并返回合适的 HTTP 响应.不过我们仅仅 ...
- django博客项目3:创建 Django 博客的数据库模型
设计博客的数据库表结构 博客最主要的功能就是展示我们写的文章,它需要从某个地方获取博客文章数据才能把文章展示出来,通常来说这个地方就是数据库.我们把写好的文章永久地保存在数据库里,当用户访问我们的博客 ...
- django 简易博客开发 2 模板和数据查询
首先还是贴一下项目地址 https://github.com/goodspeedcheng/sblog 因为代码全在上面 上一篇博客我们介绍了 django的安装配置,新建project,新建a ...
- django 简易博客开发 4 comments库使用及ajax支持
首先还是贴一下源代码地址 https://github.com/goodspeedcheng/sblog 上一篇文章我们介绍了静态文件使用以及如何使用from实现对blog的增删改,这篇将介绍如何给 ...
- Django个人博客开发 | 前言
本渣渣不专注技术,只专注使用技术,不是一个资深的coder,是一个不折不扣的copier 1.前言 自学 Python,始于 Django 框架,Scrapy 框架,elasticsearch搜索引擎 ...
随机推荐
- SpringBoot学习笔记(二)——Springboot项目目录介绍
官网生成SpringBoot项目 使用官网(https://start.spring.io/)生成一个Maven构建的的SpringBoot项目,下载下来的文件是这个样子的. 导入到IDEA中 为了查 ...
- centos610最小安装之后 后续设置
1.网络配置 centos选择最小桌面(如果不用到类似Oracle需要用到桌面的软件,则操作系统安装最小化安装)安装之后 查看网络配置如下: 截图显示网络并未启用. 2.开启网络设置 cd /etc/ ...
- vue学习笔记:Hello Vue
编写简单例子,了解下基本语法 <!DOCTYPE html> <html> <head> <meta charset="utf-8 "&g ...
- np.ndarray与PIL.Image对象相互转换
Image对象有crop功能,也就是图像切割功能,但是使用opencv读取图像的时候,图像转换为了np.adarray类型,该类型无法使用crop功能,需要进行类型转换,所以使用下面的转换方式进行转换 ...
- [转]轻松理解AOP思想(面向切面编程)
原文链接 Spring是什么 先说一个Spring是什么吧,大家都是它是一个框架,但框架这个词对新手有点抽象,以致于越解释越模糊,不过它确实是个框架的,但那是从功能的角度来定义的,从本质意义上来讲,S ...
- k8spod的介绍
yaml介绍 apiVersion: v1 APIserver 的版本 kind: Pod 资源类型 metadata: 元数据定义 name: pod-demo 元数据资源名字 labels: 定义 ...
- 牛顿迭代法--求任意数的开n次方
牛顿迭代法是求开n次方近似解的一种方法,本文参考. 引言 假如\(x^n = m\),我们需要求x的近似值. 我们设\(f(x) = x^n - m\), 那么也就是求该函数f(x)=0时与x轴的交点 ...
- Mybatis的逆向工程以及Example的实例函数及详解
Mybatis-generator是Mybatis的逆向工程 (根据数据库中的表生成java代码) Mybatis的逆向工程会生成实例及实例对应的example,example用于添加条件,相当于w ...
- 吴裕雄 Bootstrap 前端框架开发——Bootstrap 表格:联合使用所有表格类
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
- ZeroTier 局域网组建工具
无公网IP通过ZeroTier实现内网穿透 需求:想要在公司访问家里内网NAS,或是在家里访问公司服务 有固定的公网IP或动态的公网IP:常见的方案动态域名解析做端口转发方式等 无公网IP:常见的实现 ...