django實戰(二)一個較完整的博客系統


一、數據庫的構建(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
View Code

 輸入命令: 
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)
View Code

二、定義視圖函數(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 Code

該模塊用於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>
View Code

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>
View Code

運行python manage.py runserver;輸入網址:http://127.0.0.1:8000/blog/,得到網頁內容: 

 
       


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM