Python Django框架的快速入门
什么是 Django 框架
Django 是一个高级的 Python 网络框架,它鼓励快速开发和简洁、实用的设计。由经验丰富的开发者构建,它可以处理很多 Web 开发的麻烦事,因此你可以专注于编写应用,而无需重新发明轮子。Django 遵循模型 - 视图 - 控制器(MVC)架构模式的变体,称为模型 - 视图 - 模板(MVT)。
模型(Model)
模型代表你的数据结构。在 Django 中,你使用 Python 类来定义模型。每个模型类都是 django.db.models.Model
的子类。模型类的每个属性代表数据库表中的一个字段。例如,假设我们正在构建一个博客应用,我们可能有一个 Post
模型:
from django.db import models
class Post(models.Model):
title = models.CharField(max_length=200)
content = models.TextField()
pub_date = models.DateTimeField('date published')
在这个例子中,Post
模型有三个字段:title
(字符字段,最大长度为 200),content
(文本字段)和 pub_date
(日期时间字段)。
视图(View)
视图是处理用户请求并返回响应的 Python 函数或类。视图获取数据(通常通过模型),进行必要的处理,然后将数据传递给模板进行渲染。例如,对于上述的博客应用,我们可能有一个视图来显示所有的文章:
from django.http import HttpResponse
from.models import Post
def post_list(request):
posts = Post.objects.all()
output = ', '.join([p.title for p in posts])
return HttpResponse(output)
这个视图函数 post_list
获取所有的 Post
对象,并将它们的标题连接成一个字符串,然后作为 HTTP 响应返回。
模板(Template)
模板是包含占位符和标签的文本文件,用于动态生成 HTML。Django 的模板语言允许你插入变量、控制结构(如循环和条件语句)。例如,对于博客应用的文章列表,我们可以创建一个模板 post_list.html
:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Post List</title>
</head>
<body>
<ul>
{% for post in posts %}
<li>{{ post.title }}</li>
{% endfor %}
</ul>
</body>
</html>
在这里,{% for %}
和 {% endfor %}
是 Django 模板标签,用于循环遍历 posts
变量中的每个元素。{{ post.title }}
是一个变量占位符,用于插入每个 Post
对象的标题。
安装 Django
在开始使用 Django 之前,你需要安装它。如果你已经安装了 Python 和 pip
(Python 的包管理器),安装 Django 非常简单。打开你的终端并运行以下命令:
pip install django
这将从 Python 包索引下载并安装最新版本的 Django。如果你想安装特定版本,可以指定版本号,例如:
pip install django==3.2
创建 Django 项目
安装好 Django 后,你可以创建一个新的 Django 项目。在终端中,导航到你想要创建项目的目录,然后运行以下命令:
django - admin startproject myproject
这将创建一个名为 myproject
的新目录,其中包含以下结构:
myproject/
myproject/
__init__.py
settings.py
urls.py
asgi.py
wsgi.py
manage.py
manage.py
:一个命令行实用程序,用于与你的项目进行各种交互。例如,运行开发服务器、执行数据库迁移等。myproject/settings.py
:项目的设置和配置。在这里你可以配置数据库、安装的应用、静态文件路径等。myproject/urls.py
:项目的 URL 声明,就像网站的“目录”。它告诉 Django 如何将 URL 映射到视图。
创建 Django 应用
一个 Django 项目可以包含多个应用。应用是一个自包含的组件,通常用于完成特定的功能,比如博客、用户认证等。要创建一个新的应用,在项目根目录(包含 manage.py
的目录)下运行以下命令:
python manage.py startapp blog
这将创建一个名为 blog
的新目录,结构如下:
blog/
__init__.py
admin.py
apps.py
models.py
tests.py
views.py
models.py
:定义应用的数据模型。views.py
:定义处理用户请求的视图函数或类。admin.py
:用于配置 Django 管理界面,以便轻松管理应用的数据。
配置数据库
默认情况下,Django 使用 SQLite 数据库,这对于开发和小型项目非常方便。如果你想使用其他数据库,如 PostgreSQL、MySQL 等,你需要在 settings.py
文件中进行配置。
使用 SQLite
如果使用 SQLite,你不需要做太多配置。settings.py
文件中已经有以下默认配置:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': BASE_DIR / 'db.sqlite3',
}
}
这表明 Django 将使用 SQLite 数据库,数据库文件名为 db.sqlite3
,位于项目根目录。
使用 PostgreSQL
要使用 PostgreSQL,首先需要安装 psycopg2
库(Django 与 PostgreSQL 交互的驱动):
pip install psycopg2
然后在 settings.py
中修改数据库配置:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql',
'NAME': 'your_database_name',
'USER': 'your_username',
'PASSWORD': 'your_password',
'HOST': '127.0.0.1',
'PORT': '5432',
}
}
将 your_database_name
、your_username
和 your_password
替换为实际的数据库名称、用户名和密码。
定义模型
在 models.py
文件中定义你的数据模型。回到我们的博客应用示例,假设我们除了 Post
模型外,还想定义一个 Author
模型:
from django.db import models
class Author(models.Model):
name = models.CharField(max_length=100)
email = models.EmailField()
class Post(models.Model):
title = models.CharField(max_length=200)
content = models.TextField()
pub_date = models.DateTimeField('date published')
author = models.ForeignKey(Author, on_delete=models.CASCADE)
这里,Author
模型有 name
和 email
两个字段。Post
模型新增了一个 author
字段,它是一个外键,关联到 Author
模型。on_delete=models.CASCADE
表示当关联的 Author
对象被删除时,所有相关的 Post
对象也将被删除。
数据库迁移
定义好模型后,你需要创建数据库迁移文件,并将这些更改应用到数据库中。首先,运行以下命令创建迁移文件:
python manage.py makemigrations
这将在应用的 migrations
目录中创建迁移文件,记录你对模型所做的更改。然后,运行以下命令将这些迁移应用到数据库:
python manage.py migrate
migrate
命令会根据迁移文件,在数据库中创建相应的表结构。
创建视图
视图负责处理用户请求并返回响应。在 views.py
文件中定义视图函数。继续以博客应用为例,我们来创建一个视图显示特定作者的所有文章:
from django.http import HttpResponse
from.models import Post, Author
def author_posts(request, author_id):
try:
author = Author.objects.get(id=author_id)
posts = Post.objects.filter(author=author)
output = ', '.join([p.title for p in posts])
return HttpResponse(output)
except Author.DoesNotExist:
return HttpResponse("Author not found")
在这个视图函数 author_posts
中,我们通过 author_id
获取特定的 Author
对象,然后获取该作者的所有 Post
对象,并将文章标题连接成字符串返回。如果作者不存在,则返回“Author not found”。
配置 URL
URL 配置将 URL 映射到相应的视图。在项目的 urls.py
文件中,你可以包含应用的 URL 配置。首先,在项目的 urls.py
中添加以下代码:
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
path('blog/', include('blog.urls')),
]
这里,path('blog/', include('blog.urls'))
表示所有以 /blog/
开头的 URL 都将由 blog
应用的 urls.py
文件来处理。接下来,在 blog
应用的 urls.py
文件中(如果不存在,需要创建)添加以下代码:
from django.urls import path
from. import views
urlpatterns = [
path('author/<int:author_id>/', views.author_posts, name='author_posts'),
]
path('author/<int:author_id>/', views.author_posts, name='author_posts')
表示 URL /blog/author/<author_id>/
将映射到 views.author_posts
视图函数,其中 <int:author_id>
是一个动态部分,int
表示它应该是一个整数,author_id
将作为参数传递给视图函数。
创建模板
模板用于渲染 HTML 页面。在 blog
应用中创建一个 templates
目录,然后在其中创建 blog
目录(与应用名相同)。在 blog/blog
目录下创建 author_posts.html
模板:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>{{ author.name }}'s Posts</title>
</head>
<body>
<h1>{{ author.name }}'s Posts</h1>
<ul>
{% for post in posts %}
<li>{{ post.title }}</li>
{% endfor %}
</ul>
</body>
</html>
这个模板接收 author
和 posts
变量,并显示作者的名字和他的所有文章标题。
在视图中使用模板
现在,我们需要修改 author_posts
视图函数,使其使用模板来渲染响应:
from django.shortcuts import render
from.models import Post, Author
def author_posts(request, author_id):
try:
author = Author.objects.get(id=author_id)
posts = Post.objects.filter(author=author)
context = {
'author': author,
'posts': posts
}
return render(request, 'blog/author_posts.html', context)
except Author.DoesNotExist:
return HttpResponse("Author not found")
这里,我们使用 render
函数,它接受请求对象、模板名称和上下文(一个包含传递给模板的变量的字典),并返回一个渲染后的 HTTP 响应。
管理界面
Django 自带一个强大的管理界面,让你可以轻松管理应用的数据。首先,在 admin.py
文件中注册你的模型:
from django.contrib import admin
from.models import Author, Post
admin.site.register(Author)
admin.site.register(Post)
然后,运行开发服务器:
python manage.py runserver
在浏览器中访问 http://127.0.0.1:8000/admin/
,你将看到 Django 管理登录页面。默认情况下,你需要创建一个超级用户来登录。运行以下命令创建超级用户:
python manage.py createsuperuser
按照提示输入用户名、电子邮件和密码。登录后,你可以在管理界面中创建、编辑和删除 Author
和 Post
对象。
静态文件
静态文件包括 CSS、JavaScript 和图像等。在 Django 中,你需要配置静态文件的路径。首先,在 settings.py
文件中添加以下配置:
STATIC_URL = '/static/'
STATICFILES_DIRS = [
BASE_DIR /'static'
]
这表示静态文件的 URL 前缀是 /static/
,并且项目的 static
目录将用于存储静态文件。例如,如果你在 static
目录下创建一个 css
目录,并在其中放置一个 styles.css
文件,你可以在模板中这样引用它:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>{{ author.name }}'s Posts</title>
<link rel="stylesheet" href="{% static 'css/styles.css' %}">
</head>
<body>
<h1>{{ author.name }}'s Posts</h1>
<ul>
{% for post in posts %}
<li>{{ post.title }}</li>
{% endfor %}
</ul>
</body>
</html>
{% static 'css/styles.css' %}
是 Django 模板标签,用于生成静态文件的正确 URL。
处理表单
Django 提供了强大的表单处理功能。假设我们想在博客应用中添加一个表单,让用户提交新文章。首先,在 forms.py
文件中(如果不存在,需要创建)定义表单类:
from django import forms
from.models import Post
class PostForm(forms.ModelForm):
class Meta:
model = Post
fields = ['title', 'content', 'author']
这里,我们使用 ModelForm
,它根据 Post
模型自动生成表单。fields
定义了表单中包含的字段。
在视图中处理表单
在 views.py
中添加一个视图函数来处理表单提交:
from django.shortcuts import render, redirect
from.forms import PostForm
def create_post(request):
if request.method == 'POST':
form = PostForm(request.POST)
if form.is_valid():
form.save()
return redirect('post_list')
else:
form = PostForm()
return render(request, 'blog/create_post.html', {'form': form})
如果请求方法是 POST
,表示用户提交了表单,我们验证表单数据是否有效。如果有效,保存表单数据并重定向到文章列表页面。如果请求方法是 GET
,我们显示一个空表单。
创建表单模板
在 blog/blog
目录下创建 create_post.html
模板:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Create Post</title>
</head>
<body>
<h1>Create Post</h1>
<form method="post">
{% csrf_token %}
{{ form.as_p }}
<button type="submit">Submit</button>
</form>
</body>
</html>
{% csrf_token %}
用于防止跨站请求伪造攻击。{{ form.as_p }}
将表单字段渲染为段落格式。
总结
通过以上步骤,你已经了解了 Django 框架的基本使用方法,包括项目和应用的创建、模型定义、视图编写、URL 配置、模板使用、管理界面、静态文件处理和表单处理等。随着你对 Django 的深入学习,你可以探索更多高级功能,如用户认证、缓存、RESTful API 开发等,以构建更强大的 Web 应用。