本周對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)