本周对django的知识点的学习进行了实际运用:开发一个完整的博客。
博客的功能有:
1 邮箱验证功能、
2 轮播图功能、
3 博客分类功能、
4 标签云功能、
5 幻灯片功能、
6 博客推荐功能、
7 最新发布功能、
8 最新评论功能、
9 博客搜索功能、
10 友情链接功能、
11 博客列表功能、
12 博客分页功能、
13 博客标签功能、
14 分类查询功能、
15 标签查询功能、
16博客详情功能、
17 相关推荐功能、
18 发表评论功能、
19 评论列表功能、
20 用户登录功能、
21 用户注册功能、
22 注销用户功能、
23 后台富文本功能。
具体步骤:
第一步:搭建开发环境
本项目需要用到的开发环境有:virtualenv、virtualenvwrapper、pymysql、mysql数据库和django。
可以使用如下命令安装:
mysql: sudo apt install mysql-server mysql-client
pymysql:pip install pymysql
django:pip install django==1.11
第二步:创建项目、应用和数据库
创建项目:django-admin startproject 项目名
创建应用:pythonmanage.pystartapp 应用名
数据库:create database 数据库名 (想在数据库中使用中文+charset=utf8)
第三步:搭建数据模型
切换到用户应用中
#用户功能
fromdjango.contrib.auth.modelsimportAbstractUser
classBlogUser(AbstractUser):
nikename = models.CharField('昵称', max_length=20, default='')
#邮箱验证功能
classEmailVerifyRecord(models.Model):
code = models.CharField(verbose_name='验证码', max_length=50,default='')
email = models.EmailField(max_length=50, verbose_name="邮箱")
send_type = models.CharField(verbose_name="验证码类型", choices=(("register",u"注册"),("forget","找回密码"), ("update_email","修改邮箱")), max_length=30)
send_time = models.DateTimeField(verbose_name="发送时间", default=datetime.now)
classMeta:
verbose_name ="邮箱验证码"
verbose_name_plural = verbose_name
def__str__(self):
return'{0}({1})'.format(self.code, self.email)
切换到博客应用中
#轮播图功能模型
classBanner(models.Model):
title = models.CharField('标题', max_length=50)
cover = models.ImageField('轮播图', upload_to='static/images/banner')
link_url = models.URLField('图片链接', max_length=100)
idx = models.IntegerField('索引')
is_active = models.BooleanField('是否是active', default=False)
def__str__(self):returnself.title
classMeta:
verbose_name ='轮播图'
verbose_name_plural ='轮播图'
#博客分类功能模型
classBlogCategory(models.Model):
name = models.CharField('分类名称', max_length=20, default='')
classMeta:
verbose_name ='博客分类'
verbose_name_plural ='博客分类'
def__str__(self):
returnself.name
#标签功能模型
classTags(models.Model):
name = models.CharField('标签名称', max_length=20, default='')
classMeta:
verbose_name ='标签'
verbose_name_plural ='标签'
def__str__(self):
returnself.name
#发布博客功能模型
classPost(models.Model):
user = models.ForeignKey(BlogUser, verbose_name='作者')
category = models.ForeignKey(BlogCategory, verbose_name='博客分类', default=None)
tags = models.ManyToManyField(Tags, verbose_name='标签')
title = models.CharField('标题', max_length=50)
content = models.TextField('内容')
pub_date = models.DateTimeField('发布日期', default=datetime.now)
cover = models.ImageField('博客封面', upload_to='static/images/post', default=None)
views = models.IntegerField('浏览数', default=0)
recommend = models.BooleanField('推荐博客', default=False)
def__str__(self):
returnself.title
classMeta:
verbose_name ='博客'
verbose_name_plural ='博客'
#评论功能模型
classComment(models.Model):
post = models.ForeignKey(Post, verbose_name='博客')
user = models.ForeignKey(BlogUser, verbose_name='作者')
pub_date = models.DateTimeField('发布时间')
content = models.TextField('内容')
def__str__(self):returnself.content
classMeta:
verbose_name ='评论'
verbose_name_plural ='评论'
#友情链接功能模型
classFriendlyLink(models.Model):
title = models.CharField('标题', max_length=50)
link = models.URLField('链接', max_length=50, default='')
def__str__(self):
returnself.title
classMeta:
verbose_name ='友情链接'
verbose_name_plural ='友情链接'
第四步:各个功能的实现
实现幻灯片功能
一、模型
fromblogs.modelsimportBanner
admin.site.register(Banner)
二、视图函数
from.modelsimportBanner
defindex(request):
banner_list = Banner.objects.all()
ctx = {
'banner_list': banner_list,
}
returnrender(request,'index.html', ctx)
三、模板
<
ol class="carousel-indicators">
{%
for banner in banner_list%}
{%
if banner.is_active%}
<
lidata-target="#focusslide"data-slide-to="{{banner.idx}}"class="active">
{%
else%}
<
lidata-target="#focusslide"data-slide-to="{{banner.idx}}">
{%
endif%}
{%
endfor%}
ol>
<
divclass="carousel-inner"role="listbox">
{%
forbannerinbanner_list%}
{%
ifbanner.is_active%}
<
divclass="itemactive">
<
ahref="{{banner.link_url}}"target="_blank"title="{{banner.title}}" >
<
imgsrc="{{banner.cover}}"alt="{{banner.title}}"class="img-responsive">
div>
{%
else%}
<
divclass="item">
<
ahref="{{banner.link_url}}"target="_blank"title="{{banner.title}}" >
<
imgsrc="{{banner.cover}}"alt="{{banner.title}}"class="img-responsive">
div>
{%
endif%}
{%
endfor%}
div>
<
aclass="leftcarousel-control"href="#focusslide"role="button"data-slide="prev"rel="nofollow">
<
spanclass="glyphiconglyphicon-chevron-left"aria-hidden="true">
<
spanclass="sr-only">上一个
<
aclass="rightcarousel-control"href="#focusslide"role="button"data-slide="next"rel="nofollow">
<
spanclass="glyphiconglyphicon-chevron-right"aria-hidden="true">
<
spanclass="sr-only">下一个
div>
博客推荐功能
一、模型:
fromblogs.modelsimportBanner,Post,BlogCategory,Tags
...
admin.site.register(BlogCategory)
admin.site.register(Tags)
admin.site.register(Post)
二、视图:
defindex(request):
banner_list = Banner.objects.all()
recommend_list = Post.objects.filter(recommend=1)
ctx = {
'banner_list': banner_list,
'recommend_list': recommend_list,
}
returnrender(request,'index.html', ctx)