python實戰----博客系統

如何使用Django框架編寫本身的blog系統

建立項目

step_1css

首先建立一個新項目FirstBlog(如下簡稱FB),實現基礎功能,如建立數據庫,建立超級用戶,能夠實現後臺管理員登錄
過程可參考[連接描述][1]

註冊應用

step_2html

在FB中註冊應用blog,編寫數據庫文件blog/models.py,告訴主程序FirstBlog/settings.py你註冊了應用,並修改數據庫
後臺運行前,須要在blog/admin.py中註冊站點



博客屬性:id,博客標題,博客做者,博客摘要,博客正文,博客建立時間,博客所屬專欄(類別),博客標籤,閱讀數
標籤屬性:id,標籤名稱
專欄(類別)屬性:id,專欄名稱
博客和專欄: 多對一
博客和標籤: 多對多

與flask的數據庫表結構不一樣,django框架裏,數據庫表之間的關聯只須要在對應關係裏多的一側寫外鍵ForeignKey,不須要在另外一個表寫反向引用。若是是多對多的關係,可在任意一端寫ManyToManyField。前端

# blog/models.py
from django.contrib.auth.models import User
from django.db import models


# Create your models here.
# 博客屬性:id,博客標題,博客做者,博客摘要,博客正文,博客建立時間,博客所屬專欄(類別),博客標籤,閱讀數,評論數
# 標籤屬性:id,標籤名稱
# 專欄(類別)屬性:id,專欄名稱
# 博客和專欄: 多對一
# 博客和標籤: 多對多
class Category(models.Model):
    name = models.CharField(max_length=64, verbose_name='專欄名稱')

    class Meta:
        verbose_name = '專欄'
        verbose_name_plural = '專欄'
    def __str__(self):
        return '%s' %(self.name)

class Tag(models.Model):
    name = models.CharField(max_length=64, verbose_name='標籤名稱')
    class Meta:
        verbose_name = '標籤'
        verbose_name_plural = '標籤'
    def __str__(self):
        return '%s' %(self.name)

class Post(models.Model):
    title = models.CharField(max_length=100, unique=True, verbose_name='標題')
    create_time = models.DateTimeField(verbose_name='建立時間')
    summary = models.CharField(max_length=255, verbose_name='摘要')
    body = models.TextField(verbose_name='正文')
    # 做者能夠從管理員數據庫表User中查找
    author = models.ForeignKey(User, verbose_name='做者')
    category = models.ForeignKey(Category, verbose_name='專欄')
    tags = models.ManyToManyField(Tag, verbose_name='標籤')
    views = models.IntegerField(default=0,verbose_name='閱讀數')
    class Meta:
        verbose_name = '博客'
        verbose_name_plural = '博客'
    def __str__(self):
        return '%s' %(self.title)

建立數據

step_3git

後臺建立多個標籤、欄目,多篇博客,確保前端顯示是有數據的。

構造路由

step_4github

構建路由和視圖函數,並告訴主路由函數FirstBlog/settings.py如何查找

前端顯示

step_5數據庫

建立靜態模板目錄static/,修改模板文件,settings.py文件的static配置。若是沒有修改settings.py文件,可在模板文件加上{% load static%}。並修改樣式(css...)的位置
根據使用的網頁模板,顯示本身的頁面

顯示結果:
圖片描述django

如何快速準確跳轉頁面

from django.urls import reverse    #返回正確而完整的路由
爲了在html文件內,繼續閱讀能夠直接跳轉{{ post.get_url }}
注意在重寫視圖函數名稱時,須要申明命名空間

修改blog/models.py的Post表,添加屬性get_url()flask

#blog/models.py
    def get_url(self):
        return reverse('blog:detail',kwargs={'id':self.pk})
#blog/urls.py

from django.conf.urls import url
from django.contrib import admin

from blog import views
app_name = 'blog'
urlpatterns = [
    url(r'^$',views.index ,name='index'),
    url(r'book/(?P<id>\d+)/$',views.detail,name='detail' ),
]

闊以看見html文件的‘繼續閱讀’會自動連接到博客詳情頁markdown

{#templates/blog/index.html 部分代碼#}
 <div class="read-more cl-effect-14">
                                <a href="{{ post.get_url }}" class="more-link">繼續閱讀 <span
                                        class="meta-nav">→</span></a>
                            </div>

圖片描述

正文顯示使用markdown語法

如今的博客都是使用mrkdown語法來顯示的,而且配備高亮顯示app

須要下載安裝模塊Markdown,pygments
在視圖函數裏將博客正文轉成html時,加上高亮的ectensions
修改base.html,添加對應高亮的css樣式
#blog/views.py文件
 post.body = markdown(
        post.body,
        extensions=['markdown.extensions.extra',
                    'markdown.extensions.codehilite',
                    'markdown.extensions.toc', ],
        output_format='html'
    )
{#templates/blog/detail.html 部分代碼#}

  <div class="entry-content clearfix">
     {{ post.body | safe}}
   </div>
{#templates/base.html 部分代碼#}

    {#    代碼高亮顯示的樣式#}
    <link rel="stylesheet" href="/static/css/highlights/github.css">

圖片描述

增長閱讀量

修改數據庫表結構,添加增長閱讀量的方法

#blog/models.py
# 增長閱讀量
def add_views(self):
    self.views +=1
    self.save(update_fields=['views'])    #只從新保存更新字段views

修改視圖函數,當你訪問某一篇博客時,閱讀量加1

post = Post.objects.get(id=id)
post.add_views()

闊以從圖上看出,閱讀量的增長
圖片描述

相關文章
相關標籤/搜索