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/
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 %}
{% 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' %}