一、數據庫的構建(M)
首先,我們分析一個博客系統的功能:
(1)一個博客可以有多個標簽(多對多)
(2)一個博客可以有多條評論(一對多)
(3)一個博客只可以有一個類別(多對一)
接下來,我們分析關系的屬性:
博客:標題,作者,內容,發布時間,分類(外鍵),標簽(多對多)等
標簽:標簽名
類別:分類名
評論:作者,博客(外鍵),郵箱,內容,發布時間等。
最終,得到數據庫的建立(model.py): 注意! django2.0 不要用__unicode__..要用__str__,否則admin管理下多選框不顯示項目名稱

from __future__ import unicode_literals from django.db import models # Create your models here. class Category(models.Model): """ 博客分類 """ name=models.CharField('名稱',max_length=30) class Meta: verbose_name="類別" verbose_name_plural=verbose_name def __unicode__(self): return self.name class Tag(models.Model): name=models.CharField('名稱',max_length=16) class Meta: verbose_name="標簽" verbose_name_plural=verbose_name def __unicode__(self): return self.name class Blog(models.Model): title=models.CharField('標題',max_length=32) author=models.CharField('作者',max_length=16) content=models.TextField('內容') pub=models.DateField('發布時間',auto_now_add=True) category=models.ForeignKey(Category,verbose_name='分類')#多對一(博客--類別) tag=models.ManyToManyField(Tag,verbose_name='標簽')#(多對多) class Meta: verbose_name="博客" verbose_name_plural=verbose_name def __unicode__(self): return self.title class Comment(models.Model): blog=models.ForeignKey(Blog,verbose_name='博客')#(博客--評論:一對多) name=models.CharField('稱呼',max_length=16) email=models.EmailField('郵箱') content=models.CharField('內容',max_length=240) pub=models.DateField('發布時間',auto_now_add=True) class Meta: verbose_name="評論" verbose_name_plural="評論" def __unicode__(self): return self.content
輸入命令:
python manage.py makemigrations
python manage.py migrate
完成數據庫的構建,為了方便管理后台:
在admin.py里構建以下代碼:
#在setting可以更改語言和時區。這樣admin下為中文界面。
LANGUAGE_CODE = 'zh-hans'
TIME_ZONE = 'Asia/Shanghai'

from django.contrib import admin from .models import * # Register your models here. class CategoryAdmin(admin.ModelAdmin): list_display = ('name',) class TagAdmin(admin.ModelAdmin): list_display = ('name',) class BlogAdmin(admin.ModelAdmin): list_display = ('title','category','content','pub') class CommentAdmin(admin.ModelAdmin): list_display = ('blog','name','content','pub') admin.site.register(Category,CategoryAdmin) admin.site.register(Tag,TagAdmin) admin.site.register(Blog,BlogAdmin) admin.site.register(Comment,CommentAdmin)
二、定義視圖函數(V)
在view.py,我們要實現獲取顯示的所有博客;並根據博客的id顯示博客具體內容和評論。
首先,我們定義了一個特殊的forms.py模塊,方便評論的集成。定義如下:

from django import forms """ 借此完成博客的評論功能 """ class CommentForm(forms.Form): name=forms.CharField(label='稱呼',max_length=16,error_messages={ 'required':'請填寫您的稱呼', 'max_length':'稱呼太長咯' }) email=forms.EmailField(label='郵箱',error_messages={ 'required':'請填寫您的郵箱', 'invalid':'郵箱格式不正確' }) content=forms.CharField(label='內容',error_messages={ 'required':'請填寫您的評論內容!', 'max_length':'評論內容太長咯' })
該模塊用於view.py模塊以及具體博客評論;
View.py:
from django.shortcuts import render,render_to_response from .models import * from .forms import CommentForm from django.http import Http404 def get_blogs(request): blogs=Blog.objects.all().order_by('-pub')#獲得所有的博客按時間排序 return render_to_response('blog_list.html',{'blogs':blogs})#傳遞context:blog參數到固定頁面。 def get_details(request,blog_id): #檢查異常 try: blog=Blog.objects.get(id=blog_id)#獲取固定的blog_id的對象; except Blog.DoesNotExist: raise Http404 if request.method == 'GET': form = CommentForm() else:#請求方法為Post form = CommentForm(request.POST) if form.is_valid(): cleaned_data=form.cleaned_data cleaned_data['blog']=blog Comment.objects.create(**cleaned_data) ctx={ 'blog':blog, 'comments': blog.comment_set.all().order_by('-pub'), 'form': form }#返回3個參數 return render(request,'blog_details.html',ctx)
配置url: ##django2.0下路由新功能path。如果有正則。使用re_path,
例子:re_path('detail(\d)', views.get_details, name='blog_get_detail'),
from django.conf.urls import url from django.contrib import admin from blog.views import * urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^blog/$',get_blogs), url(r'^detail/(\d+)/$',get_details,name='blog_get_detail'), ]
三 模板系統(T)
blog_list.html

<!DOCTYPE html> <html lang="zh"> <head> <meta charset="UTF-8"> <title>我的博客</title> <style type="text/css"> .blog{ padding: 20px 0px; } .blog .info span{ padding-right: 10px; } .blog .summary{ padding-top: 20px; } </style> </head> <body> <div class="header"> <h1 align="center">我的博客</h1> </div> {% for blog in blogs %} <div align="center" class="blog"> <div class="title"> <a href="{% url 'blog_get_detail' blog.id %}"><h2>{{ blog.title }}</h2></a> </div> <div class="info"> <span class="category" style="color: #ff9900;">{{ blog.category.name }}</span> <span class="author" style="color: #4a86e8;">{{ blog.author }}</span> <span class="pub" style="color: #6aa84e">{{ blog.pub }}</span> </div> <div class="summary"> {{ blog.content | truncatechars:100 }} </div> </div> {% endfor %} </body> </html>
blog_details.html:

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>{{ blog.title }}</title> <style type="text/css"> .blog{ padding: 20px 0px; } .blog .info span{ padding-right: 10px; } .blog .summary{ padding-top: 20px; } </style> </head> <body> <div class="header"> <span><a href="{% url 'blog_get_detail' blog.id %}">{{ blog.title }}</a> </span> </div> <div class="content"> <div class="blog"> <div class="title"> <a href="#"><h2>{{ blog.title }}</h2></a> </div> <div class="info"> <span class="category" style="color:#ff9900 ;">{{ blog.category.name }}</span> <span class="author" style="color: #4a86e8">{{ blog.author }}</span> <span class="pub" style="color: #6aa84f">{{ blog.pub }}</span> </div> <div class="summary"> {{ blog.content }} </div> <div class="comment"> <div class="comment-diaplay" style="padding-top: 20px;"> <h3>評論</h3> {% for comment in comments %} <div class="comment-field" style="padding-top: 10px;"> {{ comment.name }}說:{{ comment.content }} </div> {% endfor %} </div> <div class="comment-post" style="padding-top: 20px ;"> <h3>提交評論</h3> <form action="{% url 'blog_get_detail' blog.id %}" method="post"> {% csrf_token %} {% for field in form %} <div class="input-field" style="padding-top: 10px;"> {{ field.label }}:{{ field }} </div> <div class="error" style="color: red;"> {{ field.errors }} </div> {% endfor %} <button type="submit" style="margin-top:10px ">提交</button> <input type="button" value="返回"> </form> </div> </div> </div> </div> </body> </html>
運行python manage.py runserver;輸入網址:http://127.0.0.1:8000/blog/,得到網頁內容: