urls.py
将请求发送到正确的视图URL 映射器通常存储在名为 urls.py 的文件中。在下面的示例中,mapper(urlpatterns)定义了特定 URL 模式 和相应视图函数之间的映射列表。如果接收到具有与指定模式匹配的 URL(例如 r’^$',下面)的 HTTP 请求,则将调用 相关联的视图功能(例如 views.index)并传递请求。
from django.urls import path
urlpatterns = [
path(r'^$', views.index),
path(r'^([0-9]+)/$', views.best),
]
在Django中,捕获 URL 中的特定部分(也称为路径参数或标记)是通过在 URL 模式中使用尖括号<>
来完成的。常见的捕获标记有:
: 匹配一个整数,并将其作为pk
参数传递给视图函数。
: 匹配一个字母、数字、连字符或下划线组成的字符串,并将其作为slug_text
参数传递给视图函数。
: 匹配一个字符串,并将其作为my_string
参数传递给视图函数。
: 匹配一个路径(包含多个部分的字符串),并将其作为my_path
参数传递给视图函数。from django.urls import path
from . import views
urlpatterns = [
path('books//' , views.book_detail, name='book-detail'),
path('authors//' , views.author_detail, name='author-detail'),
]
在这个例子中,
和
是捕获标记,分别匹配一个整数和一个slug格式的字符串,并将其作为pk
和author_slug
参数传递给相应的视图函数。
views.py
处理请求在Django中,views.py
文件包含了处理请求的视图函数。这些视图函数负责接收请求,处理数据并返回HTTP响应。
一个基本的视图函数通常会接收一个HttpRequest对象作为参数,并返回一个HttpResponse对象作为响应。例如:
from django.http import HttpResponse
def my_view(request):
# 处理请求的逻辑
return HttpResponse("Hello, this is the response!")
在views.py
中的视图函数可能包含以下逻辑:
request
对象(Django中,request
对象是通过框架自动提供的)中获取GET或POST参数、路径参数(如果有的话)等。常用的方法
render()
和HttpResponse
都用于构建HTTP响应,但它们有一些不同之处:
render(): 这是Django的一个辅助函数,它用于渲染模板并返回一个HTTP响应。render()
接受request
作为第一个参数,指定要渲染的模板名称作为第二个参数,还可以选择性地传递上下文参数。它会将模板和上下文数据合并,然后返回一个完整的HTTP响应对象。例如,你可以在视图中使用render()
来渲染一个HTML模板:
from django.shortcuts import render
def my_view(request):
# 一些数据处理...
context = {'key': 'value'}
return render(request, 'template_name.html', context)
HttpResponse: 这是Django的HTTP响应类。你可以使用HttpResponse
手动创建HTTP响应,为其指定内容、状态码和其他HTTP头。当你想要直接返回文本、JSON数据或其他非HTML响应时,可以使用HttpResponse
。例如:
from django.http import HttpResponse
import json
def my_json_view(request):
data = {'key': 'value'}
json_data = json.dumps(data)
return HttpResponse(json_data, content_type='application/json')
models.py
定义数据模型Django Web 应用程序通过被称为模型的 Python 对象来管理和查询数据。模型定义存储数据的结构,包括字段类型 以及字段可能的最大值,默认值,选择列表选项,文档帮助文本,表单的标签文本等。模型的定义与底层数据库无关 -你可以选择其中一个作为项目设置的一部分。一旦你选择了要使用的数据库,你就不需要直接与之交谈 - 只需编写模型结构和其他代码,Django 可以处理与数据库通信的所有辛苦的工作。
创建 Django 中的模型涉及以下步骤:
定义模型类: 在你的应用程序的 models.py
文件中定义模型类。每个模型类都是一个继承自 django.db.models.Model
的 Python 类。
定义字段: 在模型类中定义字段,这些字段将成为数据库表中的列。Django 提供了许多不同类型的字段,例如 CharField
、IntegerField
、DateField
等,用于存储不同类型的数据。
定义元数据(可选): 你可以在模型类中定义一些元数据,例如数据库表名、排序方式等。
创建迁移: 使用 Django 的管理工具创建迁移文件。迁移文件包含了数据库模式的变更,通过执行迁移文件,可以将这些变更应用到数据库中。
应用迁移: 执行应用程序的迁移命令,将模型更改应用到数据库中。
# 生成迁移文件
python manage.py makemigrations
# 应用迁移
python manage.py migrate
models
查询数据在 Django 中,当你使用模型管理器方法进行查询时,Django 会根据你的查询转换为相应的 SQL 语句来执行数据库操作。以下是一些常见的查询方法以及对应的 SQL 查询:
获取所有对象:
all_books = Book.objects.all() # SELECT * FROM yourapp_book;
根据条件过滤对象:
filtered_books = Book.objects.filter(author='Author Name')
# SELECT * FROM yourapp_book WHERE author = 'Author Name';
获取单个对象:
book = Book.objects.get(author='Author Name')
# SELECT * FROM yourapp_book WHERE author = 'Author Name' LIMIT 1;
book = Book.objects.get(pk=1)
# SELECT * FROM yourapp_book WHERE id = 1 LIMIT 1;
其他查询方法
books = Book.objects.exclude(author='Author Name')
# SELECT * FROM yourapp_book WHERE NOT (author = 'Author Name');
books = Book.objects.order_by('title')
# SELECT * FROM yourapp_book ORDER BY title ASC;
最后查询到的是对象实例
HTML模板
呈现数据HTML模板在Django中使用了特殊的模板语言,这些语言元素可以嵌入HTML中,实现动态的、基于数据的渲染。以下是HTML模板中常用的几个特殊语法:
模板标签:使用 {% %}
包裹起来的代码块,用于执行逻辑操作,如循环、条件判断等。
{% if condition %}
... some HTML code ...
{% endif %}
变量:使用 {{ }}
包裹起来的变量名,用于在模板中显示动态数据。
<p>Book Title: {{ book.title }}p>
模板注释:使用 {# #}
包裹起来的注释,不会在最终的渲染结果中显示。
{# This is a comment #}
模板过滤器:使用 |
可以对变量进行过滤或操作。
djangoCopy code
{{ value|filter }}
模板继承:使用 {% extends %}
和 {% block %}
可以实现模板之间的继承和覆盖。
{% extends 'base.html' %}
{% block content %}
... content specific to this template ...
{% endblock %}
模板标签库:使用 {% load %}
加载自定义的模板标签或过滤器库。
djangoCopy code
{% load custom_tags %}
这些特殊的模板语法允许在HTML模板中嵌入逻辑、变量和控制结构,使得Django的模板可以根据数据动态生成页面内容。
数据由视图传递到模板,模板提取数据进行渲染
mkdir myproject
cd myproject
# 创建虚拟环境
python3 -m venv myenv
# Linux下激活虚拟环境
source myenv/bin/activate
# 退出虚拟环境
deactivate
# 安装django
pip3 install django -i https://pypi.tuna.tsinghua.edu.cn/simple
# 创建新项目
django-admin startproject locallibrary
此时会创建如下文件夹结构
locallibrary/
manage.py
locallibrary/
settings.py
urls.py
wsgi.py
manage.py
是 Django 项目的命令行工具,用于执行多种任务,包括但不限于:
运行开发服务器:启动 Django 开发服务器以在本地运行项目。python3 manage.py runserver
创建应用程序:通过 python manage.py startapp app_name
创建一个新的应用程序。
执行数据库迁移:管理数据库模型变更并将其应用到数据库中。
python3 manage.py makemigrations
python3 manage.py migrate
创建超级用户:创建可以登录 Django 后台管理界面的管理员账号。python manage.py createsuperuser
收集静态文件:将静态文件(如 CSS、JavaScript 文件等)收集到一个位置,以便部署。python3 manage.py collectstatic
运行单元测试:执行项目中定义的单元测试。python manage.py test
查看 Django 命令列表:通过 python manage.py help
或 python manage.py
查看所有可用的 Django 命令列表。
locallibrary 项目的子文件夹是整个网站的进入点:
python3 manage.py startapp catalog
在此之后的文件夹结构如下:
locallibrary/
manage.py
locallibrary/
catalog/
admin.py
apps.py
models.py
tests.py
views.py
__init__.py
migrations/
其他一些说明:
admin.py
文件中,你可以注册模型以便在 Django 自带的管理界面中对这些模型进行管理和操作。这个文件用于配置管理员后台可以访问和管理的模型。apps.py
文件的主要作用是提供关于应用程序的元数据信息,方便 Django 框架使用和展示。tests.py
是 Django 应用程序中用于编写测试的文件。在这个文件中,你可以编写各种测试来验证你的应用程序的不同部分,确保它们按预期运行。migration
文件夹,用来存储“migrations”——当你修改你的数据模型时,这个文件会自动升级你的数据库。settings.py
项目设置注册应用
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'your_app.apps.Your_appConfig',
]
配置数据库
默认使用SQLite
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
}
}
使用Mysql
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'your_db_name',
'USER': 'your_username',
'PASSWORD': 'your_password',
'HOST': 'localhost',
'PORT': '',
}
}
数据库之前的数据迁移
python manage.py dumpdata > data.json # 导出SQLite数据
python manage.py loaddata data.json # 导入数据到MySQL
静态文件配置
STATIC_URL = '/static/' # 定义静态文件的URL前缀。
STATICFILES_DIRS = [BASE_DIR / "static"] # 指定了额外的静态文件目录
STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles') # 在collectstatic命令运行后,用于收集所有静态文件的文件夹路径。
STATICFILES_FINDERS # 定义了查找静态文件的方式
模板配置
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [
'/path/to/your/templates', # 指定额外的模板目录
],
'APP_DIRS': True, # 在应用程序的 templates 目录中查找模板
# 其他设置...
},
]
其他配置
TIME_ZONE = 'Asia/Shanghai' # 时区配置
DEBUG = True # 这个会在 debug 日志里输出错误信息,而不是输入 HTTP 的返回码。在生产环境中,它应设置为 false,因为输出的错误信息会帮助想要攻击网站的人。
Django提供了通用类视图来简化开发常见的 Web 功能,其中之一是通用类别视图。这些类别视图可用于快速构建常见的应用程序组件,如列表、详情页等。常见的通用类别视图包括:
这些类别视图旨在减少代码量,通过约定俗成的命名和配置,提供了内置的处理逻辑。通过组合这些视图类和提供一些配置参数,你可以快速创建功能完善的视图。
常用参数
常用方法
from django.views.generic import ListView, DetailView
from .models import YourModel
class YourModelListView(ListView):
model = YourModel
template_name = 'your_template.html'
class YourModelDetailView(DetailView):
model = YourModel
template_name = 'your_template.html'
会话是 Django(以及大多数 Internet)用于跟踪站点和特定浏览器之间“状态”的机制。
启动会话
INSTALLED_APPS = [
...
'django.contrib.sessions',
....
MIDDLEWARE = [
...
'django.contrib.sessions.middleware.SessionMiddleware',
....
使用会话
# Get a session value by its key (e.g. 'my_car'), raising a KeyError if the key is not present
my_car = request.session['my_car']
# Get a session value, setting a default if it is not present ('mini')
my_car = request.session.get('my_car', 'mini')
# Set a session value
request.session['my_car'] = 'mini'
# Delete a session value
del request.session['my_car']
# 假设你修改了会话数据中的一些内容
request.session['my_car']['wheels'] = 'new_wheels'
# 将会话标记为已修改
request.session.modified = True
如果你对会话数据做了更改,并希望这些更改被保存,你可以使用
modified
标志来手动告知 Django 会话已被修改。
可以使用 Django 内置的身份验证视图类来实现这些功能。下面是示例代码:
from django.urls import path
from django.contrib.auth.views import (
LoginView, LogoutView, PasswordChangeView, PasswordChangeDoneView,
PasswordResetView, PasswordResetDoneView, PasswordResetConfirmView,
PasswordResetCompleteView
)
urlpatterns = [
path('accounts/login/', LoginView.as_view(), name='login'),
path('accounts/logout/', LogoutView.as_view(), name='logout'),
path('accounts/password_change/', PasswordChangeView.as_view(), name='password_change'),
path('accounts/password_change/done/', PasswordChangeDoneView.as_view(), name='password_change_done'),
path('accounts/password_reset/', PasswordResetView.as_view(), name='password_reset'),
path('accounts/password_reset/done/', PasswordResetDoneView.as_view(), name='password_reset_done'),
path('accounts/reset///' , PasswordResetConfirmView.as_view(), name='password_reset_confirm'),
path('accounts/reset/done/', PasswordResetCompleteView.as_view(), name='password_reset_complete'),
# 其他 URL 配置...
]
这些路径配置了与 Django 内置的身份验证视图相关的 URL,并将每个视图与其对应的名称关联起来。使用这些视图类,你可以快速地设置登录、注销、密码更改和密码重置等功能。
这些身份验证视图使用 Django 的模板引擎渲染模板。默认情况下,它们使用以下模板:
registration/login.html
用于登录页面registration/logged_out.html
用于注销确认页面registration/password_change_form.html
用于密码更改表单页面registration/password_change_done.html
用于密码更改完成页面registration/password_reset_form.html
用于密码重置表单页面registration/password_reset_done.html
用于密码重置确认页面registration/password_reset_confirm.html
用于密码重置确认页面registration/password_reset_complete.html
用于密码重置完成页面你可以自定义这些模板,或者通过指定额外的参数template_name
来使用不同的模板文件:
# 例如,更改登录视图的模板:
path('accounts/login/', LoginView.as_view(template_name='myapp/custom_login.html'), name='login'),
这将告诉 Django 使用myapp/custom_login.html
作为登录页面的模板。同样的方法可以应用于其他身份验证视图,以便你可以为每个视图选择不同的模板。
ne.html` 用于密码更改完成页面
registration/password_reset_form.html
用于密码重置表单页面registration/password_reset_done.html
用于密码重置确认页面registration/password_reset_confirm.html
用于密码重置确认页面registration/password_reset_complete.html
用于密码重置完成页面你可以自定义这些模板,或者通过指定额外的参数template_name
来使用不同的模板文件:
# 例如,更改登录视图的模板:
path('accounts/login/', LoginView.as_view(template_name='myapp/custom_login.html'), name='login'),
这将告诉 Django 使用myapp/custom_login.html
作为登录页面的模板。同样的方法可以应用于其他身份验证视图,以便你可以为每个视图选择不同的模板。