入门
准备环境
$ python --version
# Python 3.12
$ pip --version
# pip <版本号> from <路径> (python 3.12)
如果你没有安装 PIP,你可以从这个页面下载并安装它: https://pypi.org/project/pip/
入门
- 创建虚拟环境
$ py -m venv myproject # Windows $ python3.12 -m venv myproject # Unix/MacOS
- 这将创建一个名为 “myproject” 的文件夹,其中包含子文件夹和文件,如下所示:
“`
myproject
├┈Include
├┈Lib
├┈Scripts
╰┈pyvenv.cfg
“`
-
激活环境
# Windows: myproject\Scripts\activate.bat # Unix/MacOS: source myproject/bin/activate
- 激活后,你的命令提示符会显示如下:
“`bash
# Windows:
(myproject) C:\Users\Your Name>
# Unix/MacOS:
(myproject) … $
“`
-
安装 Django
# Windows: (myproject) C:\Users\Name>py -m pip install Django # Unix/MacOS: (myproject) ... $ python3.12 -m pip install Django
创建项目
$ django-admin startproject myworld
- 这将在当前目录下创建一个名为 “myworld” 的文件夹,包含以下内容:
myworld ├┈ manage.py ╰┈ myworld/ ├┈ __init__.py ├┈ asgi.py ├┈ settings.py ├┈ urls.py ╰┈ wsgi.py
- 运行 Django 项目:
$ py manage.py runserver # Windows $ python3.12 manage.py runserver # Unix/MacOS
- 打开浏览器,访问
127.0.0.1:8000
查看运行结果。
- 打开浏览器,访问
检查 Django 版本
(myproject) C:\Users\Your Name>django-admin --version
# <版本号>
创建应用
$ py manage.py startapp members
- 这将在 “myworld” 文件夹内创建一个名为 “members” 的文件夹,包含以下内容:
myworld ├┈ manage.py ├┈ myworld/ ╰┈ members/ ├┈ migrations/ ┆ ╰┈ __init__.py ├┈ __init__.py ├┈ admin.py ├┈ apps.py ├┈ models.py ├┈ tests.py ╰┈ views.py
views.py
文件用于编写视图函数,处理用户请求并返回响应。
应用目录介绍
- Django 遵循 MVT(模型-视图-模板)设计模式:
- Django 接收 URL 请求。
- 检查
urls.py
文件,找到与 URL 匹配的视图函数。 - 视图函数调用相关模型,从数据库获取数据。
- 模型定义在
models.py
文件中。 - 视图函数将数据传递给模板,渲染成 HTML 页面。
- 模板包含 HTML、CSS 和 Django 模板语言。
视图
- Django 视图是 Python 函数,接收 HTTP 请求并返回 HTTP 响应(通常是 HTML 页面)。
- 每个视图函数负责处理特定 URL 的请求。
-
视图函数通常定义在
views.py
文件中。 -
初始的
members/views.py
文件内容如下:from django.shortcuts import render # Create your views here.
- 修改
members/views.py
文件,添加一个简单的视图函数:from django.shortcuts import render from django.http import HttpResponse def index(request): return HttpResponse("Hello world!")
- 这个视图函数接收一个
request
对象(代表 HTTP 请求),并返回一个HttpResponse
对象,内容为 “Hello world!”。
- 这个视图函数接收一个
URLs
- URL 配置告诉 Django 当用户访问某个 URL 时,应该执行哪个视图函数。
- URL 配置定义在
urls.py
文件中。 -
在
members
文件夹下创建urls.py
文件,添加以下内容:from django.urls import path from . import views urlpatterns = [ path('', views.index, name='index'), ]
- 这行代码将根 URL (
/members/
) 映射到views.py
文件中的index
视图函数。
- 这行代码将根 URL (
- 修改项目根目录下的
myworld/urls.py
文件,将 members 应用的 URL 配置包含进来:from django.contrib import admin from django.urls import include, path urlpatterns = [ path('members/', include('members.urls')), path('admin/', admin.site.urls), ]
- 这行代码将所有以
/members/
开头的 URL 请求都交给members.urls
文件处理。
- 这行代码将所有以
- 现在,运行开发服务器,访问
127.0.0.1:8000/members/
,你将看到 “Hello world!” 的输出。
模板
-
模板是包含 HTML、CSS 和 Django 模板语言的文件,用于生成动态网页内容。
-
在
members
文件夹下创建templates
文件夹,并在其中创建myfirst.html
文件:myworld ├┈ manage.py ├┈ myworld/ ╰┈ members/ ╰┈ templates/ ╰┈ myfirst.html
- 在
myfirst.html
中添加以下内容:<!DOCTYPE html> <html> <body> <h1>Hello World!</h1> <p>欢迎来到我的第一个 Django 项目!</p> </body> </html>
- 修改
members/views.py
文件,使用模板渲染页面:from django.shortcuts import render from django.http import HttpResponse from django.template import loader def index(request): template = loader.get_template('myfirst.html') return HttpResponse(template.render())
- 现在,
index
视图函数会加载myfirst.html
模板,并将其渲染成 HTML 返回给浏览器。
- 现在,
更改设置
- 为了让 Django 识别新建的 “members” 应用,需要将其添加到
INSTALLED_APPS
设置中。 -
打开
myworld/settings.py
文件,找到INSTALLED_APPS
部分,添加members.apps.MembersConfig
:INSTALLED_APPS = [ # ...其他应用... 'members.apps.MembersConfig', ]
- 现在,Django 能够识别并使用 “members” 应用。
创建表(模型)
-
模型定义了数据库表结构和数据操作方法。
-
打开
members/models.py
文件,添加一个名为Members
的模型:from django.db import models class Members(models.Model): firstname = models.CharField(max_length=255) lastname = models.CharField(max_length=255)
- 这个模型定义了一个名为 “members_members” 的数据库表,包含
id
、firstname
和lastname
三个字段。
- 这个模型定义了一个名为 “members_members” 的数据库表,包含
- 执行以下命令创建数据库迁移文件:
$ py manage.py makemigrations members
- 这将生成一个迁移文件
members/migrations/0001_initial.py
,记录了模型的变更。
- 这将生成一个迁移文件
- 执行以下命令应用数据库迁移:
$ py manage.py migrate
- 这将根据迁移文件创建数据库表。
Django 模板
模板变量
- 可以在模板中使用双大括号
{{ 变量名 }}
来插入变量的值。 -
例如,在
myfirst.html
中添加以下内容:<h1>你好,{{ firstname }}!</h1>
- 在
members/views.py
中的index
视图函数中,传递一个firstname
变量给模板:from django.shortcuts import render from django.http import HttpResponse from django.template import loader def index(request): template = loader.get_template('myfirst.html') context = { 'firstname': 'Django', } return HttpResponse(template.render(context, request))
- 现在,访问
127.0.0.1:8000/members/
,你将看到 “你好,Django!” 的输出。
模板中创建变量
-
可以使用
{% with ... %}
标签在模板中创建临时变量:{% with firstname="Tobias" %} <h1>你好,{{ firstname }}!</h1> {% endwith %}
数组循环
- 可以使用
{% for ... %}
标签循环遍历数组:<ul> {% for x in mymembers %} <li>{{ x.firstname }} {{ x.lastname }}</li> {% endfor %} </ul>
- 假设
mymembers
是一个包含多个Member
对象的列表,每个对象都有firstname
和lastname
属性。
- 假设
模板标签参考
标签 | 描述 |
---|---|
autoescape |
控制是否自动转义 HTML 特殊字符。 |
block |
定义可被子模板覆盖的代码块。 |
comment |
注释掉模板代码。 |
csrf_token |
生成 CSRF 令牌,用于防止跨站请求伪造攻击。 |
cycle |
在循环中循环使用多个值。 |
debug |
输出调试信息。 |
extends |
继承另一个模板。 |
filter |
对变量应用过滤器。 |
firstof |
输出第一个非空的变量值。 |
for |
循环遍历数组。 |
if |
条件判断。 |
ifchanged |
如果变量值发生变化,则输出内容。 |
include |
包含另一个模板。 |
load |
加载自定义模板标签库。 |
lorem |
生成随机文本。 |
now |
输出当前日期和时间。 |
regroup |
对列表进行分组。 |
resetcycle |
重置 cycle 标签的计数器。 |
spaceless |
删除 HTML 标签之间的空格。 |
templatetag |
输出模板标签的原始内容。 |
url |
生成 URL。 |
verbatim |
不解析其中的模板语言,直接输出原始内容。 |
widthratio |
计算两个数字的比例,用于生成宽度值。 |
with |
创建临时变量。 |
If 语句
- 使用
{% if ... %}
、{% elif ... %}
和{% else %}
标签进行条件判断:{% if today == 'Monday' %} 今天是星期一。 {% elif today == 'Sunday' %} 今天是星期天。 {% else %} 今天不是星期一也不是星期天。 {% endif %}
For 循环
- 使用
{% for ... %}
标签循环遍历数组:<ul> {% for x in mylist %} <li>{{ x }}</li> {% endfor %} </ul>
- 可以使用
{% empty %}
标签处理空列表的情况:<ul> {% for x in mylist %} <li>{{ x }}</li> {% empty %} <li>列表为空。</li> {% endfor %} </ul>
循环变量
- 在
{% for ... %}
循环中,可以使用以下变量:
变量名 | 描述 |
---|---|
forloop.counter |
当前循环的计数器,从 1 开始。 |
forloop.counter0 |
当前循环的计数器,从 0 开始。 |
forloop.first |
是否为第一次循环。 |
forloop.last |
是否为最后一次循环。 |
forloop.parentloop |
如果存在嵌套循环,则指向父级循环。 |
forloop.revcounter |
反向计数器,从循环次数开始递减,到 1 结束。 |
forloop.revcounter0 |
反向计数器,从循环次数 – 1 开始递减,到 0 结束。 |
过滤值
- 过滤器用于修改变量的值,使用管道符
|
应用。 -
例如,使用
upper
过滤器将字符串转换为大写:<h1>{{ mystring|upper }}</h1>
注释
- 使用
{# ... #}
注释掉单行模板代码。{# 这是一个注释。 #}
- 使用
{% comment ... %}
注释掉多行模板代码。{% comment %} 这是多行注释。 {% endcomment %}
双过滤值
- 可以级联多个过滤器,例如:
<h1>{{ mystring|lower|capfirst }}</h1>
- 这将先将字符串转换为小写,然后再将首字母大写。
过滤器标签
- 可以使用
{% filter ... %}
标签对一段文本应用过滤器:{% filter upper %} This text will be uppercase. {% endfilter %}
cycle
标签
cycle
标签用于在循环中循环使用多个值:<ul> {% for x in mylist %} <li style="background-color: {% cycle 'red' 'green' 'blue' %}">{{ x }}</li> {% endfor %} </ul>
- 这将为列表中的每一项应用不同的背景颜色。
- 可以使用
as
语句将循环的值赋给变量:{% cycle 'red' 'green' 'blue' as mycolor %}
- 可以使用
silent
选项隐藏循环值的输出:{% cycle 'red' 'green' 'blue' as mycolor silent %}
- 可以使用
resetcycle
标签重置循环计数器:{% resetcycle %}
每一行添加行号
- 可以使用
linenumbers
过滤器为每行文本添加行号:{% filter linenumbers %} This is line 1. This is line 2. This is line 3. {% endfilter %}
- 输出:
1. This is line 1. 2. This is line 2. 3. This is line 3.
- 输出:
导入模板
- 可以使用
{% include ... %}
标签导入另一个模板:{% include 'header.html' %}
- 这将把
header.html
模板的内容插入到当前位置。
- 这将把
导入模板并传入变量
- 可以在导入模板时,使用
with
语句传递变量:{% include 'article.html' with title="My Article" author="John Doe" %}
- 这将把
title
和author
变量传递给article.html
模板。
- 这将把
过滤器参考
过滤器名 | 描述 |
---|---|
add |
加法运算。 |
addslashes |
在引号前添加反斜杠。 |
capfirst |
将字符串的第一个字符转换为大写。 |
center |
居中对齐字符串。 |
cut |
删除字符串中所有指定的子字符串。 |
date |
格式化日期。 |
default |
如果变量为空或不存在,则使用默认值。 |
default_if_none |
如果变量为 None,则使用默认值。 |
dictsort |
对字典进行排序。 |
dictsortreversed |
反向对字典进行排序。 |
divisibleby |
判断一个数是否可以被另一个数整除。 |
escape |
转义 HTML 特殊字符。 |
escapejs |
转义 JavaScript 特殊字符。 |
filesizeformat |
格式化文件大小。 |
first |
返回列表的第一个元素。 |
floatformat |
格式化浮点数。 |
force_escape |
强制转义 HTML 特殊字符。 |
get_digit |
获取数字的指定位数。 |
iriencode |
对 IRI 进行编码。 |
join |
使用指定的分隔符连接列表中的元素。 |
json_script |
将 Python 数据结构转换为安全的 JavaScript 代码。 |
last |
返回列表的最后一个元素。 |
length |
返回字符串的长度或列表的元素个数。 |
length_is |
判断字符串的长度或列表的元素个数是否等于指定值。 |
linebreaks |
将文本中的换行符转换为 <br> 标签。 |
linebreaksbr |
将文本中的换行符转换为 <br> 标签。 |
linenumbers |
为每行文本添加行号。 |
ljust |
左对齐字符串。 |
lower |
将字符串转换为小写。 |
make_list |
将值转换为列表。 |
phone2numeric |
将电话号码中的字母转换为数字。 |
pluralize |
根据数量添加复数后缀。 |
pprint |
格式化输出 Python 对象。 |
random |
从列表中随机选择一个元素。 |
rjust |
右对齐字符串。 |
safe |
标记字符串为安全的,不需要转义。 |
safeseq |
标记列表中的所有字符串为安全的,不需要转义。 |
slice |
切片字符串或列表。 |
slugify |
将字符串转换为 URL 友好的字符串。 |
stringformat |
使用 Python 的格式化字符串语法格式化字符串。 |
striptags |
删除字符串中的 HTML 标签。 |
time |
格式化时间。 |
timesince |
计算时间间隔。 |
timeuntil |
计算时间间隔。 |
title |
将字符串转换为标题格式。 |
truncatechars |
截取指定长度的字符串,并在末尾添加省略号。 |
truncatechars_html |
截取指定长度的 HTML 字符串,并在末尾添加省略号。 |
truncatewords |
截取指定个数的单词,并在末尾添加省略号。 |
truncatewords_html |
截取指定个数的 HTML 单词,并在末尾添加省略号。 |
unordered_list |
将嵌套列表渲染为无序列表。 |
upper |
将字符串转换为大写。 |
urlencode |
对 URL 进行编码。 |
urlize |
将 URL 转换为可点击的链接。 |
urlizetrunc |
将 URL 转换为可点击的链接,并截取指定长度。 |
wordcount |
统计字符串中的单词个数。 |
wordwrap |
对字符串进行自动换行。 |
yesno |
根据布尔值返回不同的字符串。 |
字段查询参考
查询关键字 | 描述 |
---|---|
contains |
包含指定字符串(区分大小写)。 |
icontains |
包含指定字符串(不区分大小写)。 |
date |
日期等于指定日期。 |
day |
日期字段的日部分等于指定值。 |
endswith |
以指定字符串结尾(区分大小写)。 |
iendswith |
以指定字符串结尾(不区分大小写)。 |
exact |
完全匹配(区分大小写)。 |
iexact |
完全匹配(不区分大小写)。 |
in |
在指定列表中。 |
isnull |
为空。 |
gt |
大于。 |
gte |
大于等于。 |
hour |
日期时间字段的小时部分等于指定值。 |
lt |
小于。 |
lte |
小于等于。 |
minute |
日期时间字段的分钟部分等于指定值。 |
month |
日期字段的月份部分等于指定值。 |
quarter |
日期字段的季度部分等于指定值。 |
range |
在指定范围内。 |
regex |
匹配正则表达式(区分大小写)。 |
iregex |
匹配正则表达式(不区分大小写)。 |
second |
日期时间字段的秒部分等于指定值。 |
startswith |
以指定字符串开头(区分大小写)。 |
istartswith |
以指定字符串开头(不区分大小写)。 |
time |
日期时间字段的时间部分等于指定值。 |
week |
日期字段的周数等于指定值。 |
week_day |
日期字段的星期几等于指定值(星期日为 1)。 |
iso_week_day |
日期字段的 ISO 8601 格式星期几等于指定值(星期一为 1)。 |
year |
日期字段的年份部分等于指定值。 |
iso_year |
日期字段的 ISO 8601 格式年份部分等于指定值。 |
添加静态文件
添加 CSS 文件
- 在
members
文件夹下创建static
文件夹,并在其中创建myfirst.css
文件:myworld ├┈ manage.py ├┈ myworld/ ╰┈ members/ ├┈ templates/ ├┈ static/ ╰┈ myfirst.css
- 在
myfirst.css
中添加 CSS 样式:body { background-color: lightblue; font-family: verdana; }
- 在
members/templates/myfirst.html
中加载 CSS 文件:{% load static %} <!DOCTYPE html> <html> <head> <link rel="stylesheet" href="{% static 'myfirst.css' %}"> </head> <body> </body> </html>
{% load static %}
标签用于加载静态文件模板标签。{% static ... %}
标签用于生成静态文件的 URL。
添加 JS 文件
- 在
members/static
文件夹下创建myfirst.js
文件:myworld ├┈ manage.py ├┈ myworld/ ╰┈ members/ ├┈ templates/ ├┈ static/ ├┈ myfirst.css ╰┈ myfirst.js
- 在
myfirst.js
中添加 JavaScript 代码:function myFunction() { alert("Hello from a static file!"); }
- 在
members/templates/myfirst.html
中加载 JS 文件:{% load static %} <!DOCTYPE html> <html> <head> <link rel="stylesheet" href="{% static 'myfirst.css' %}"> </head> <body> <button onclick="myFunction()">Click Me</button> <script src="{% static 'myfirst.js' %}"></script> </body> </html>
添加图片文件
- 将图片文件(例如
logo.png
)放到members/static
文件夹下:myworld ├┈ manage.py ├┈ myworld/ ╰┈ members/ ├┈ templates/ ├┈ static/ ├┈ myfirst.css ├┈ myfirst.js ╰┈ logo.png
- 在
members/templates/myfirst.html
中显示图片:{% load static %} <!DOCTYPE html> <html> <head> <link rel="stylesheet" href="{% static 'myfirst.css' %}"> </head> <body> <img src="{% static 'logo.png' %}" alt="Logo"> <button onclick="myFunction()">Click Me</button> <script src="{% static 'myfirst.js' %}"></script> </body> </html>
另见
- Django 官方文档
- Django 教程 – 菜鸟教程
- Django 框架教程 – 编程狮
- Django 4 中文教程 – W3Cschool
- Django Tutorial – W3Schools
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。
评论(0)