Django之博客系统

1. Django简介

Django是一个由Python编写的开源Web框架,它遵循MVC(Model-View-Controller)的软件设计模式,帮助开发人员构建可扩展、高效、安全和易于维护的Web应用程序。

Django的特点:

快速开发:Django使用快速开发哲学,使开发人员快速创建原型、测试、迭代,并将其转化为生产中的Web应用程序。

全栈:Django不仅可以处理Web 请求并生成响应,还可以处理数据库、表单验证等事情。Django还包括一些内置模块,如高效的URL路由系统、会话管理等。

安全:Django自带许多预防常见的安全漏洞的措施,如跨站点请求伪造攻击(CSRF保护)、XSS攻击(自动HTML转义)、SQL注入(ORM技术)等。

可扩展性:Django遵循可插拔的设计哲学,允许开发人员使用不同的应用程序、插件和库来增强其功能。

以上是Django的一些介绍,接下来将介绍如何使用Django来创建一个博客系统。

2. 创建Django项目和应用程序

在开始创建新的Django项目和应用程序之前,确保您已经安装了Django。可以使用以下命令来检查Django是否安装。

python -m django --version

假设您已经安装了Django,我们将创建名为“blog”的新Django项目,并在其中创建一个应用程序。

2.1 创建Django项目

django-admin startproject blog

上面的命令将创建名为blog的新Django项目。该命令将会创建以下文件。

blog/

|--blog

|--manage.py

这些文件的作用如下:

blog/:Django项目的主目录,包含与应用程序相关的类、模板、静态文件和URL路由器。

blog/blog/:包含用于项目设置的文件,例如setting.py、url.py等。

manage.py:Django项目的命令行实用程序,可以用于管理(运行、测试、创建、删除)应用程序。

2.2 创建Django应用程序

运行以下命令以创建名为“blog”的新Django应用程序。

cd blog

python manage.py startapp blog_app

上面的命令将创建名为“blog_app”的新Django应用程序。应用程序的代码在blog目录下的blog_app目录中。应用程序目录结构如下所示。

blog/

|--blog

| |--__init__.py

| |--settings.py

| |--urls.py

| |--asgi.py

| |--wsgi.py

|--manage.py

|--blog_app

|--__init__.py

|--admin.py

|--apps.py

|--models.py

|--tests.py

|--urls.py

|--views.py

3. 设计模型类

在任何Web应用程序中,数据都是最重要的部分。在这种情况下,我们将使用Django的ORM(对象关系映射)库来定义博客系统中使用的数据结构。ORM将使我们能够使用Python类来定义模型,然后通过Django创建对应的数据库表,并根据需要提供适当的API。

3.1 博客模型类

为了开始定义博客数据结构,需要引入Django的models库。定义博客模型类,如下所示。

from django.db import models

from datetime import datetime

class Blog(models.Model):

title = models.CharField(max_length=255)

summary = models.TextField()

content = models.TextField()

image = models.ImageField(upload_to='images/')

publish_date = models.DateTimeField(default=datetime.now)

def __str__(self):

return self.title

代码首先导入了Django的models库,然后定义了Blog模型类。Blog模型类是通过继承django.db.models.Model类来创建的。在这个模型类中,我们定义了以下字段:

title:博客的标题,CharField是一个字符串字段类型,max_length参数是必需的,用于设置该字段可以包含的最大字符数。

summary:博客的摘要,该字段是一个文本字段类型。

content:博客的详细内容,该字段也是文本字段类型。

image:博客的图片字段,使用ImageField存储图片。

publish_date:博客的发布日期字段,默认情况下,它将使用当前日期和时间作为默认值。

代码中还定义了__str__方法,该方法返回博客对象的字符串表示形式,用于在Django管理后台中显示对象。

3.2 分类模型类

博客系统需要有分类功能,因此需要定义一个Category类。它将有一个名为name的字段。如下所示。

class Category(models.Model):

name = models.CharField(max_length=100)

def __str__(self):

return self.name

上面的代码定义了分类模型类。该模型类具有一个名为name的CharField字段,表示该分类的名称。

3.3 标签模型类

博客系统的标签可以帮助用户轻松地搜索它们需要的内容,因此我们需要定义一个Tag类。Tag类将有一个名为name的字段。如下所示。

class Tag(models.Model):

name = models.CharField(max_length=100)

def __str__(self):

return self.name

上面的代码定义了标记模型类。该模型类具有一个名为name的CharField字段,表示标签的名称。

3.4 评论模型类

博客系统需要评论功能,因此需要定义一个Comment类。它将有一个名为name、email、content和blog的字段。如下所示。

class Comment(models.Model):

name = models.CharField(max_length=20)

email = models.EmailField()

content = models.TextField()

blog = models.ForeignKey(Blog, on_delete=models.CASCADE, related_name='comments')

def __str__(self):

return self.name

上面的代码定义了评论模型类。该模型类具有4个字段分别为“name”、“email”、“content”和“blog”,对应评论的作者、电子邮件地址、内容和评论所属的博客文章。

注意,Comment类中的blog字段使用ForeignKey字段类型指向Blog模型。ForeignKey是一种用于创建多对一关系的Django Model字段类型。 因此,一个博客文章可以有多个评论,但每个评论只能属于一个博客文章。

4. 设置Django管理后台

Django内置了一个用于管理站点内容的后台。管理后台将让您轻松地创建、修改和删除站点内容,而无需担心在前台与内容交互的代码。

在 Django 中,有两个步骤来启用管理页面。

第一个是在管理后台显示要在其中管理的模型

第二个步骤是创建 /admin/urls.py 文件,它将渲染所有关联模型到一个管理页面上。

4.1 在管理后台显示模型

在“blog_app/admin.py”文件中,您可以注册任何模型以便在管理后台中使用。如下所示。

from django.contrib import admin

from .models import Blog, Category, Tag, Comment

admin.site.register(Blog)

admin.site.register(Category)

admin.site.register(Tag)

admin.site.register(Comment)

上面的代码将Blog、Category、Tag和Comment模型注册到Django管理后台中。

4.2 创建/ admin / URL

现在我们需要将这些注册模型放在一个页面中。中我们需要创建 /admin/urls.py 文件。如下所示。

from django.contrib import admin

from django.urls import path, include

urlpatterns = [

path('admin/', admin.site.urls),

]

我们已经创建了 /admin/urls.py 文件,并将其包含在 blog/urls.py 文件中。我们现在可以使用 Django 管理台.

5. 配置博客App的URL路由

URL路由是指URL请求与它们处理的视图之间的映射。 Django使用URL路由来解析浏览器请求并确定如何响应它们。

我们将在单独的板块中解释视觉和视图的含义。 在这里我们将处理如何将URL请求映射到视图中。 这是在约定Python和Django项目结构的帮助下完成的。

在我们的应用程序中,我们将维护一个新文件夹,称为“templates”和一个名为“blog”的文件夹。

该“blog”文件夹中将包含博客模板,而“templates”文件夹将包含基本模板(尾部、页眉等)。

我们需要围绕博客系统构建一个基本网站。 我们将使用Django的模板系统来构建这个网站。在此模板系统中,我们定义的所有博客页面都是。 因此需要设置一些URL路由器。

5.1 blog_app/url.py 文件

下面是在“blog_app/url.py”中定义主URL路由器的代码。在博客系统中,这应该是唯一的URL路由器。

from django.urls import path

from . import views

urlpatterns = [

path('', views.blog_list, name='blog_list'),

path('blog//', views.blog_detail, name='blog_detail'),

path('tag//', views.tag_detail, name='tag_detail'),

path('category//', views.category_detail, name='category_detail'),

]

上面的代码定义了4个URL路由:

blog_list:该URL路由匹配由空路径指定的博客列表视图。

blog_detail:url表达式为“blog/ /”,其中pk是当前博客的主键。

tag_detail:url表达式为“tag / <slug: slug> /”,其中slug是当前tag的名称。

category_detail:url表达式为“category / <slug: slug> /”,其中slug是目录名称。

5.2 blog_list视图函数

下面是一个简单的blog_list视图函数定义:

def blog_list(request):

blogs = Blog.objects.all().order_by('-publish_date')

categories = Category.objects.annotate(num_blogs=Count('blog'))

return render(request, 'blog/blog_list.html', {'blogs': blogs, 'categories': categories})

上面的代码定义了一个名为blog_list的视图函数。 这个函数从数据库中获取所有博客对象,并以按发布日期排序的顺序显示它们。

Django提供了一个模板响应对象,它使用与render()函数相同的基本语法。我们简单地创建一个名为“blog_list.html”的HTML模板,其中我们将应用程序与URL路由器集成。模板中的上下文可以由视图函数返回。最终,做出的模板呈现为一个响应对象。

下面是一个简单的模板中表示的代码:

{% extends 'base.html' %}

{% block content %}

{% for blog in blogs %}

{{blog.title}}

{{blog.summary}}

{% endfor %}

{% endblock %}

上面的模板使用Django的模板语言包括了一个名为“base.html”的基本模板,它使用一个名为“content”的块。我们还遍历所有博客,创建一个带有链接和标题的HTML模板,其中我们链接到“blog_detail”视图。

5.3 blog_detail视图函数

下面是一个简单的blog_detail视图函数定义:

def blog_detail(request, pk):

try:

blog = Blog.objects.get(pk=pk)

comments = blog.comments.filter(active=True)

new_comment = None

if request.method == 'POST':

comment_form = CommentForm(data=request.POST)

if comment_form.is_valid():

new_comment = comment_form.save(commit=False)

new_comment.blog = blog

new_comment.save()

return redirect('blog_detail', pk=blog.pk)

else:

comment_form = CommentForm()

return render(request, 'blog/blog_detail.html', {'blog': blog, 'comments': comments, 'new_comment': new_comment, 'comment_form': comment_form})

except Blog.DoesNotExist:

raise Http404("Post does not exist")

上面的代码定义了一个名为blog_detail的视图函数。该视图功能等同于查找具有给定主键的博客,然后在一个模板中呈现该博客的详细信息。

视图函数首先尝试查找由主键指定的博客。如果找到,则获取所有活动评论。如果已提交评论,则使用comment_form对象验证表单。新评论将与该博客对象相关联,并被保存。最后,该函数呈现HTML模板,以显示博客、评论和新评论表单。

下面是一个简单的模板中表示的代码:

{% extends 'base.html' %}