当前位置: 首页 > 工具软件 > Django Cool > 使用案例 >

Django 初始Django

洪承天
2023-12-01

Django

官方文档地址

2. 初识Django

Django 最初被设计用于具有快速开发需求的新闻类站点,目的是要实现简单快捷的网站开发。

2.1 设计模型

Django 无需数据库就可以使用,它提供了 对象关系映射器, 通过此技术,开发者可以使用 Python 代码来描述数据库结构。

from django.db import models

## 报道者
class Reporter(models.Model):
    full_name = models.CharField(max_length=70)

    def __str__(self):
        return self.full_name
## 文章
class Article(models.Model):
    pub_date = models.DateField()
    headline = models.CharField(max_length=200)
    content = models.TextField()
    reporter = models.ForeignKey(Reporter, on_delete=models.CASCADE)

    def __str__(self):
        return self.headline

2.2 应用数据模型

运行 Django 命令行实用程序以自动创建数据库表

py manage.py makemigrations
py manage.py migrate

makemigrations命令查找所有可用的模型,为任意一个在数据库中不存在对应数据表的模型创建迁移脚本文本。

migrate 命令则运行这些迁移来自动创建数据库表。还提供可选的 更丰富的控制模式。

2.3 享用便捷的API

用一套便捷而丰富的 Python API 访问数据。API 是动态创建的,不需要代码生成

# Import the models we created from our "news" app
# 导入创建的新闻“APP”
>>> from news.models import Article, Reporter

# No reporters are in the system yet.
# 当前系统中还没有报道者
>>> Reporter.objects.all()
<QuerySet []>

# Create a new Reporter.
# 创建一个新的报道者,full_name 为 John Smith
>>> r = Reporter(full_name='John Smith')

# Save the object into the database. You have to call save() explicitly.
# 保存至数据库,必须显式地调用save方法
>>> r.save()

# Now it has an ID.
# 现在r有了一个ID号
>>> r.id
1

# Now the new reporter is in the database.
# 数据库中有了新的报道者 John Smith
>>> Reporter.objects.all()
<QuerySet [<Reporter: John Smith>]>

# Fields are represented as attributes on the Python object.
# Python对象的属性 → 数据库字段
>>> r.full_name
'John Smith'

# Django provides a rich database lookup API.
# Django提供了丰富的数据库查找API
>>> Reporter.objects.get(id=1)
<Reporter: John Smith>
>>> Reporter.objects.get(full_name__startswith='John')
<Reporter: John Smith>
>>> Reporter.objects.get(full_name__contains='mith')
<Reporter: John Smith>
>>> Reporter.objects.get(id=2)
Traceback (most recent call last):
    ...
DoesNotExist: Reporter matching query does not exist.

# Create an article.
# 创建一篇文章
>>> from datetime import date
>>> a = Article(pub_date=date.today(), headline='Django is cool',
...     content='Yeah.', reporter=r)
>>> a.save()

# Now the article is in the database.
# 在数据库了
>>> Article.objects.all()
<QuerySet [<Article: Django is cool>]>

# Article objects get API access to related Reporter objects.
# 报道者是外键,文章对象获得相关报道者对象的信息
>>> r = a.reporter
>>> r.full_name
'John Smith'

# And vice versa: Reporter objects get API access to Article objects.
# 反过来,报道者对象也可以对文章进行访问
>>> r.article_set.all()
<QuerySet [<Article: Django is cool>]>

# The API follows relationships as far as you need, performing efficient
# JOINs for you behind the scenes.
# This finds all articles by a reporter whose name starts with "John".
# 查找报道者名字以“John”开头报道的所有文章
>>> Article.objects.filter(reporter__full_name__startswith='John')
<QuerySet [<Article: Django is cool>]>

# Change an object by altering its attributes and calling save().
# 改变对象属性,显式调用call()保存修改
>>> r.full_name = 'Billy Goat'
>>> r.save()

# 使用delete()方法删除一个实体
# Delete an object with delete().
>>> r.delete()

2.4 一个动态管理接口:并非徒有其表

当模型完成定义,Django 就会自动生成一个专业的生产级 管理接口 ——一个允许认证用户添加、更改和删除对象的 Web 站点。开发者只需在管理站点上注册模型即可。

from django.contrib import admin

from . import models

admin.site.register(models.Article)

这样设计所遵循的理念是,站点编辑人员可以是员工、客户、自己。

创建 Django 应用的典型流程是,先建立数据模型,然后搭建管理站点,之后员工(或者客户)就可以向网站里填充数据了。

2.4 规划URLS

简洁优雅的 URL 规划对于一个高质量网络应用来说至关重要。Django 推崇优美的 URL 设计,所以不要把诸如 .php.asp 之类的冗余的后缀放到 URL 里。

为了设计开发者自己的 URLconf ,需要创建一个叫做 URLconf 的 Python 模块。这是网站的目录,它包含了一张 URL 和 Python 回调函数之间的映射表。URLconf 也有利于将 Python 代码与 URL 进行解耦。

from django.urls import path

from . import views

urlpatterns = [
              ## URL路径        ## Python回调函数“视图”
    path('articles/<int:year>/', views.year_archive),
    path('articles/<int:year>/<int:month>/', views.month_archive),
    path('articles/<int:year>/<int:month>/<int:pk>/', views.article_detail),
]

路径字符串使用参数标签从URL中“捕获”相应值。当用户请求页面时,Django 依次遍历路径,直至初次匹配到了请求的 URL。(如果无匹配项,Django 会调用 404 视图。) 这个过程非常快,因为路径在加载时就编译成了正则表达式。

一旦有 URL 路径匹配成功,Django 会调用相应的视图函数。每个视图函数会接受一个请求对象——包含请求元信息——以及在匹配式中获取的参数值。

当用户请求了这样的 URL "/articles/2005/05/39323/",Django 会调用news.views.article_detail(request, year=2005, month=5, pk=39323)。

2.5 编写视图

视图函数的执行结果只可能有两种:返回一个包含请求页面元素的 HttpResponse 对象,或者是抛出 Http404 这类异常。

一个视图的工作就是:从参数获取数据,装载一个模板,然后将根据获取的数据对模板进行渲染。

from django.shortcuts import render

from .models import Article

def year_archive(request, year):
    a_list = Article.objects.filter(pub_date__year=year)
    context = {'year': year, 'article_list': a_list}
    return render(request, 'news/year_archive.html', context)
                ### 加载 news/year_archive.html 模板

2.6 设计模板

Django 允许设置搜索模板路径,这样可以最小化模板之间的冗余。在 Django 设置中,开发者可以通过 DIRS 参数指定一个路径列表用于检索模板。如果第一个路径中不包含任何模板,就继续检查第二个,以此类推。

{% extends "base.html" %}

{% block title %}Articles for {{ year }}{% endblock %}

{% block content %}
<h1>Articles for {{ year }}</h1>

{% for article in article_list %}
    <p>{{ article.headline }}</p> 
    <p>By {{ article.reporter.full_name }}</p>
    <p>Published {{ article.pub_date|date:"F j, Y" }}</p>
{% endfor %}
{% endblock %}

变量都被双大括号括起来了。

{{ article.headline }} 的意思是“输出 article 的 headline 属性值”。

{{ article.pub_date|date:"F j, Y" }} 使用了 Unix 风格的“管道符”(“|”字符)。这是一个模板过滤器,用于过滤变量值。在这里过滤器将一个 Python datetime 对象转化为指定的格式(就像 PHP 中的日期函数那样)。

Django 使用了 ‘‘模板继承’’ 的概念。这就是 {% extends "base.html" %} 的作用。它的含义是’‘先加载名为 base 的模板,并且用下面的标记块对模板中定义的标记块进行填充’'。简而言之,模板继承可以使模板间的冗余内容最小化:每个模板只需包含与其它文档有区别的内容。

{% load static %}
<html>
<head>
    <title>{% block title %}{% endblock %}</title>
</head>
<body>
    <img src="{% static 'images/sitelogo.png' %}" alt="Logo">
    {% block content %}{% endblock %}
</body>
</html>

Django 的任何组成【模型、视图和模板】都是独立的。

 类似资料: