入门

准备环境

$ python --version
# Python 3.12
$ pip --version
# pip <版本号> from <路径> (python 3.12)

如果你没有安装 PIP,你可以从这个页面下载并安装它: https://pypi.org/project/pip/

入门

  1. 创建虚拟环境
    $ py -m venv myproject # Windows
    $ python3.12 -m venv myproject # Unix/MacOS
    
  • 这将创建一个名为 “myproject” 的文件夹,其中包含子文件夹和文件,如下所示:

    “`
    myproject
    ├┈Include
    ├┈Lib
    ├┈Scripts
    ╰┈pyvenv.cfg
    “`

  1. 激活环境

    # Windows:
    myproject\Scripts\activate.bat
    # Unix/MacOS:
    source myproject/bin/activate
    
  • 激活后,你的命令提示符会显示如下:

    “`bash
    # Windows:
    (myproject) C:\Users\Your Name>
    # Unix/MacOS:
    (myproject) … $
    “`

  1. 安装 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 视图函数。
  • 修改项目根目录下的 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” 的数据库表,包含 idfirstnamelastname 三个字段。
  • 执行以下命令创建数据库迁移文件:
    $ 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 对象的列表,每个对象都有 firstnamelastname 属性。

模板标签参考

标签 描述
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" %}
    
    • 这将把 titleauthor 变量传递给 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>
    

另见

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。