django實戰(二)一個較完整的部落格系統
阿新 • • 發佈:2018-12-31
昨天實現了一個簡單的部落格顯示系統,今天實現一個較為完整的部落格系統,當然還未進行完整的介面優化,但是釋出還是可以實現的。
一、資料庫的構建(M)
首先,我們分析一個部落格系統的功能:
(1)一個部落格可以有多個標籤(多對多)
(2)一個部落格可以有多條評論(一對多)
(3)一個部落格只可以有一個類別(多對一)
接下來,我們分析關係的屬性:
部落格:標題,作者,內容,釋出時間,分類(外來鍵),標籤(多對多)等
標籤:標籤名
類別:分類名
評論:作者,部落格(外來鍵),郵箱,內容,釋出時間等。
最終,得到資料庫的建立(model.py):
#coding=utf-8
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裡構建以下程式碼:
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模組,方便評論的整合。定義如下:
#coding=utf-8
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:
#coding=utf-8
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:
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>
具體部落格內容及評論:
這裡的部落格功能已經具有了,但是還不完善,還有一些功能有待日後補充。
補充修改過的部落格主頁,借鑑了實戰一里的內容。
具體程式碼:
<!DOCTYPE html>
<html lang="zh">
<head>
<meta charset="UTF-8">
<title>我的部落格</title>
<style type="text/css">
body{
color: #efd;
background: #CCCCCC;
padding: 12px 5em;
margin:7px;
}
h1{
margin-top: -10px;
padding: 2em ;
background: #675;
}
h2{
color: #85F2F2;
border-top: 1px dotted #fff;
margin-top:2em;
}
.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>
<h3 style="margin-bottom: -50px;font-size: x-large;">部落格列表
</h3>
<hr/>
{% for blog in blogs %}
<div align="center" class="blog">
<div class="title">
<a href="{% url 'blog_get_detail' blog.id %}"><h2 align="left">{{ blog.title }}</h2></a>
</div>
<div class="info" align="left">
<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>