栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

Django(一)简单的个人博客搭建实战

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Django(一)简单的个人博客搭建实战

前言

本章主要讲述基于Django框架上,搭建一个比较简单的个人博客

ps:觉得页面太丑了的话大家可以自己优化,前端我这里没套框架直接用的原生css+html
我的审美止于此了 - -


环境:

  • python 3.6
  • Pycharm


一、Django框架介绍 1、创建Django项目
  • 直接在pycharm里新建一个Django项目即可


2、框架简要介绍
  • 创建完后会自动生成Django的框架,那我们这part就简单介绍一下各个文件是干啥的


二、框架搭建 1、后台搭建 1.1)model.py
"""
    数据库表模型类
"""
from __future__ import unicode_literals
from django.db import models


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)
    # on_delete解释:当子表中的某条数据删除后,关联的外键操作
    # on_delete = models.SET_NULL
    # 置空模式,删除时,外键字段被设置为空,前提就是blank=True, null=True,定义该字段时,允许为空。
    # 理解:删除关联数据(子表),与之关联的值设置默认值为null(父表中),这个前提需要父表中的字段可以为空。
    category = models.ForeignKey(Category, verbose_name='分类', on_delete=None)  # 多对一(博客--类别)
    # 多对多关系,没有on_delete参数
    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='博客', on_delete=None)  # (博客--评论:一对多)
    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

1.2)admin.py
"""
    # Register your models here.
    django自带的后台管理系统
    在这儿注册你的模型
"""
from django.contrib import admin
from .models import *


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)

1.3)创建数据库及字段
# teminal输入命令
python manage.py makemigrations
python manage.py migrate

# 创建管理员用户
python manage.py createsuperuser


1.4)后台管理员模块展示
  • 访问127.0.0.1:8000/admin即可查看后台管理系统


2、前台搭建 2.1)views.py
"""
    视图函数
    注意所有的视图函数需要在urls中进行配置
"""
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')
    # 传递context:blog参数到固定页面
    return render_to_response('blog_list.html', {'blogs': blogs})


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)

2.2)urls.py
"""
    配置文件路由
"""
from django.conf.urls import url
from django.contrib import admin
from django.urls import path

from MyBlog.views import get_blogs, get_details

urlpatterns = [
    # path(..)是Django2.0的写法,url(...)是Django1.0的写法
    path('admin/', admin.site.urls),
    url(r'^blog/$', get_blogs),
    url(r'^detail/(d+)/$', get_details, name='blog_get_detail'),
]

2.3)forms.py
  • 因为我们想要实现博客的评论功能,所以我们新增一个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': '评论内容太长咯'
    })



3、模板页面

3.1)blog_list.html



    
    Mikasa的博客
    



    

Mikasa的博客

博客列表
{% for blog in blogs %}

{{ blog.title }} {{ blog.category.name }} {{ blog.author }} {{ blog.pub }}

{{ blog.content | truncatechars:100 }}

{% endfor %}


3.2)blog_details.html



    
    {<!-- -->{ blog.title }}
    



    
        {{ blog.title }}
    



    
        
            {{ blog.category.name }}
            {{ blog.author }}
            {{ blog.pub }}
        
        

{{ blog.content }}

评论 {% for comment in comments %} {{ comment.name }}说:{{ comment.content }} {% endfor %} 提交评论
{% csrf_token %} {% for field in form %} {{ field.label }}:{{ field }} {{ field.errors }} {% endfor %}


三、运行项目及展示

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/932035.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号