如果你是一位python开发初学者,而且你对Django一无所知,那下面介绍的内容将会是你所需要知道的关于 Django 的知识。

一、快速入门

你是刚学 Python、Django 或是初学编程吗? 那么你来对地方了,因为下面要讲的内容非常重要!

二、 教你如何从零开始学习:

2.1 什么是Django

说起Django,其实Django 最初设计的意向是:设计用于具有快速开发需求的新闻类站点,而目的是要实现简单快捷的网站开发,但正因为这点,Django被大众所熟知,并快速成为在python领域最有影响力的web开发框架。

2.2 如何安装Django

快速安装指南

开始用 Django 前,需要先进行安装,同时你需要有Python开发环境。

安装 Python

作为一个 Python Web 框架,Django 需要 Python。

最新版本的 Python 可以通过访问 https://www.python.org/downloads/ 或者操作系统的包管理工具获取。

你可以在你的 shell 中输入 python 来确定你是否安装过 Python;:

Python 3.x.y
[GCC 4.x] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>>

设置数据库

此步骤仅在你打算使用诸如 PostgreSQL、MariaDB、MySQL 或者 Oracle 这些大型数据库引擎时需要。

安装 Django

这遍文章将详细的教你怎么安装Django: Django开发数据可视化大屏-项目启动配置

验证

若要验证 Django 是否能被 Python 识别,可以在 shell 中输入 python。 然后在 Python 提示符下,尝试导入 Django:

>>> import django
>>> print(django.get_version())
3.2

2.3 如何新手入门

需要入门学习,你需要知道下面这些:

强大到无需数据库就可以使用:

从设计模型的角度来说,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 News(models.Model):
    createdate = 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

上面的代码有什么作用呢?通过上面的代码可以建数据表,同时上面的字段在新建表时自动创建。

那么我们要怎么用上面的数据模型呢?

接下来我们只要运行 Django 命令行程序,这样就会自动创建数据库表:

$ python manage.py makemigrations
$ python manage.py migrate

上面makemigrations是干什么的呢?

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

那migrate又是做什么的呢?

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

数据库表是有了,但要怎么加点数据进去呢?

这个时候我们可以用Python API,通过Python API可以访问你的数据,而且API 是动态创建的,不需要代码生成就可以完成:

# Import the models we created from our "news" app
>>> from news.models import News, Reporter

# No reporters are in the system yet.
>>> Reporter.objects.all()
<QuerySet []>

# Create a new Reporter.
>>> r = Reporter(full_name='John Smith')

# Save the object into the database. You have to call save() explicitly.
>>> r.save()

# Now it has an ID.
>>> r.id
1

# Now the new reporter is in the database.
>>> Reporter.objects.all()
<QuerySet [<Reporter: John Smith>]>

# Fields are represented as attributes on the Python object.
>>> r.full_name
'John Smith'

# Django provides a rich database lookup 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 = News(createdate=date.today(), headline='Django is cool',
...     content='Yeah.', reporter=r)
>>> a.save()

# Now the article is in the database.
>>> News.objects.all()
<QuerySet [<News: 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".
>>> News.objects.filter(reporter__full_name__startswith='John')
<QuerySet [<News: Django is cool>]>

# Change an object by altering its attributes and calling save().
>>> r.full_name = 'Billy Goat'
>>> r.save()

# Delete an object with delete().
>>> r.delete()

并非徒有其表的动态管理接口:

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

开始注册你的模型

from django.contrib import admin
from . import models

admin.site.register(models.Article)

这样设计的理念:

这样设计所遵循的理念是,可以完成一个拥有权限角色管理的后台,而且这一切你不需要再去开发。

Django 应用的典型流程:

先建立数据模型,然后搭建管理站点,之后你就可以向网站里填充数据了,最后就是如何展示这些数据。

优美的 URL 设计

访问网站需要URL,简洁优雅的 URL 对于一个高质量 Web 应用来说至关重要,你应该不希望通过类似http://www.*****.com/news/index.php这样的URL去访问吧。

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

下面这个 URL的配置文件适用于前面 Reporter/News 的例子:

from django.urls import path

from . import views

urlpatterns = [
    path('news/<int:year>/', views.year_archive),
    path('news/<int:year>/<int:month>/', views.month_archive),
    path('news/<int:year>/<int:month>/<int:pk>/', views.article_detail),
]

上面代码的作用:

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

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

例如,当用户请求了这样的 URL “/news/2021/11/1111/”,Django 会调用 news.views.article_detail(request, year=2021, month=11, pk=1111)。

编写视图来显示数据

光上面的这些,你可能还看不到你模型中的数据,你需要显示出来,这里就要说到视图函数,视图函数的执行结果只可能有两种:返回一个包含请求页面元素的 HttpResponse 对象,或者是抛出 Http404 这类异常。至于执行过程中的其它的动作则由你决定。

通常来说,一个视图的工作就是:从参数获取数据,装载一个模板,然后将根据获取的数据对模板进行渲染。下面是一个 year_archive 的视图样例:

from django.shortcuts import render

from .models import News

def year_archive(request, year):
    a_list = Article.objects.filter(createdate__year=year)
    context = {'year': year, 'article_list': a_list}
    return render(request, 'news/year_archive.html', context)

给视图设计模板

上面的代码加载了 news/year_archive.html 模板。

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

news/year_archive.html 模板内容:

{% extends "base.html" %}

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

{% block content %}
<h1>News 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 }}
使用了 Unix 风格的“管道符”(“|”字符):{{ article.pub_date|date:“F j, Y” }}
‘‘模板继承’’ :{% extends “base.html” %}

下面是 base.html

{% 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 的模板系统中的一部分知识,当然你也可以不使用模板系统。

2.4 什么是进阶学习

当你学完上面基本的知识后,我要考虑学点进阶知识:
比如如何编写可复用的应用或提交你的第一个 Django 补丁等。