W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗值獎勵
Django 最初被設(shè)計用于具有快速開發(fā)需求的新聞類站點,目的是要實現(xiàn)簡單快捷的網(wǎng)站開發(fā)。以下內(nèi)容簡要介紹了如何使用 Django 實現(xiàn)一個數(shù)據(jù)庫驅(qū)動的網(wǎng)絡(luò)應(yīng)用。
為了讓您充分理解 Django 的工作原理,這份文檔為您詳細描述了相關(guān)的技術(shù)細節(jié)。
Django 無需數(shù)據(jù)庫就可以使用,它提供了 對象關(guān)系映射器 通過此技術(shù),你可以使用 Python 代碼來描述數(shù)據(jù)庫結(jié)構(gòu)。
你可以使用強大的 數(shù)據(jù)-模型語句 來描述你的數(shù)據(jù)模型,這解決了數(shù)年以來在數(shù)據(jù)庫模式中的難題。以下是一個簡明的例子:
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
接下來,運行 Django 命令行實用程序以自動創(chuàng)建數(shù)據(jù)庫表:
...\> py manage.py makemigrations
...\> py manage.py migrate
該 ?makemigrations
命令查找所有可用的模型,為任意一個在數(shù)據(jù)庫中不存在對應(yīng)數(shù)據(jù)表的模型創(chuàng)建遷移腳本文件。?migrate
?命令則運行這些遷移來自動創(chuàng)建數(shù)據(jù)庫表。
接下來,你就可以使用一套便捷而豐富的 Python API 訪問你的數(shù)據(jù)。API 是動態(tài)創(chuàng)建的,不需要代碼生成:
# Import the models we created from our "news" app
>>> from news.models import Article, 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 = 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".
>>> Article.objects.filter(reporter__full_name__startswith='John')
<QuerySet [<Article: 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 就會自動生成一個專業(yè)的生產(chǎn)級 管理接口 ——一個允許認證用戶添加、更改和刪除對象的 Web 站點。你只需在管理站點上注冊你的模型即可:
from django.db import models
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)
from django.contrib import admin
from . import models
admin.site.register(models.Article)
這樣設(shè)計所遵循的理念是,站點編輯人員可以是你的員工、你的客戶、或者就是你自己——而你大概不會樂意去廢半天勁創(chuàng)建一個只有內(nèi)容管理功能的后臺管理界面。
創(chuàng)建 Django 應(yīng)用的典型流程是,先建立數(shù)據(jù)模型,然后搭建管理站點,之后你的員工(或者客戶)就可以向網(wǎng)站里填充數(shù)據(jù)了。后面我們會談到如何展示這些數(shù)據(jù)。
簡潔優(yōu)雅的 URL 規(guī)劃對于一個高質(zhì)量網(wǎng)絡(luò)應(yīng)用來說至關(guān)重要。Django 推崇優(yōu)美的 URL 設(shè)計,所以不要把諸如 ?.php
? 和 ?.asp
? 之類的冗余的后綴放到 URL 里。
為了設(shè)計你自己的 URLconf ,你需要創(chuàng)建一個叫做 URLconf 的 Python 模塊。這是網(wǎng)站的目錄,它包含了一張 URL 和 Python 回調(diào)函數(shù)之間的映射表。URLconf 也有利于將 Python 代碼與 URL 進行解耦(譯注:使各個模塊分離,獨立)。
下面這個 URLconf 適用于前面 ?Reporter/Article
? 的例子:
from django.urls import path
from . import views
urlpatterns = [
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 路徑映射到了 Python 回調(diào)函數(shù)(“視圖”)。路徑字符串使用參數(shù)標簽從URL中“捕獲”相應(yīng)值。當用戶請求頁面時,Django 依次遍歷路徑,直至初次匹配到了請求的 URL。(如果無匹配項,Django 會調(diào)用 404 視圖。) 這個過程非???,因為路徑在加載時就編譯成了正則表達式。
一旦有 URL 路徑匹配成功,Django 會調(diào)用相應(yīng)的視圖函數(shù)。每個視圖函數(shù)會接受一個請求對象——包含請求元信息——以及在匹配式中獲取的參數(shù)值。
例如,當用戶請求了這樣的 URL "?/articles/2005/05/39323/
?",Django 會調(diào)用 ?news.views.article_detail(request, year=2005, month=5, pk=39323)
?。
視圖函數(shù)的執(zhí)行結(jié)果只可能有兩種:返回一個包含請求頁面元素的 ?HttpResponse
?對象,或者是拋出 ?Http404
?這類異常。至于執(zhí)行過程中的其它的動作則由你決定。
通常來說,一個視圖的工作就是:從參數(shù)獲取數(shù)據(jù),裝載一個模板,然后將根據(jù)獲取的數(shù)據(jù)對模板進行渲染。下面是一個 ?year_archive
?的視圖樣例:
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)
這個例子使用了 Django 模板系統(tǒng) ,它有著很多強大的功能,而且使用起來足夠簡單,即使不是程序員也可輕松使用。
上面的代碼加載了 ?news/year_archive.html
? 模板。
Django 允許設(shè)置搜索模板路徑,這樣可以最小化模板之間的冗余。在 Django 設(shè)置中,你可以通過 ?DIRS
參數(shù)指定一個路徑列表用于檢索模板。如果第一個路徑中不包含任何模板,就繼續(xù)檢查第二個,以此類推。
讓我們假設(shè) ?news/year_archive.html
? 模板已經(jīng)找到。它看起來可能是下面這個樣子:
{% 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 屬性值”。這個“點”還有更多的用途,比如查找字典鍵值、查找索引和函數(shù)調(diào)用。
我們注意到 ?{{ article.pub_date|date:"F j, Y" }}
? 使用了 Unix 風格的“管道符”(“|”字符)。這是一個模板過濾器,用于過濾變量值。在這里過濾器將一個 Python datetime 對象轉(zhuǎn)化為指定的格式(就像 PHP 中的日期函數(shù)那樣)。
你可以將多個過濾器連在一起使用。你還可以使用你 自定義的模板過濾器 。你甚至可以自己編寫 自定義的模板標簽 ,相關(guān)的 Python 代碼會在使用標簽時在后臺運行。
Django 使用了 ''模板繼承'' 的概念。這就是 ?{% extends "base.html" %}
? 的作用。它的含義是''先加載名為 base 的模板,并且用下面的標記塊對模板中定義的標記塊進行填充''。簡而言之,模板繼承可以使模板間的冗余內(nèi)容最小化:每個模板只需包含與其它文檔有區(qū)別的內(nèi)容。
下面是 base.html 可能的樣子,它使用了 靜態(tài)文件 :
{% load static %}
<html>
<head>
<title>{% block title %}{% endblock %}</title>
</head>
<body>
<img src="{% static 'images/sitelogo.png' %}" alt="Logo">
{% block content %}{% endblock %}
</body>
</html>
簡而言之,它定義了這個網(wǎng)站的外觀(利用網(wǎng)站的 logo),并且給子模板們挖好了可以填的”坑“。這就意味著你可以通過修改基礎(chǔ)模板以達到重新設(shè)計網(wǎng)頁的目的。
它還可以讓你利用不同的基礎(chǔ)模板并重用子模板創(chuàng)建一個網(wǎng)站的多個版本。通過創(chuàng)建不同的基礎(chǔ)模板,Django 的創(chuàng)建者已經(jīng)利用這一技術(shù)來創(chuàng)造了明顯不同的手機版本的網(wǎng)頁。
注意,你并不是非得使用 Django 的模板系統(tǒng),你可以使用其它你喜歡的模板系統(tǒng)。盡管 Django 的模板系統(tǒng)與其模型層能夠集成得很好,但這不意味著你必須使用它。同樣,你可以不使用 Django 的數(shù)據(jù)庫 API。你可以用其他的數(shù)據(jù)庫抽象層,像是直接讀取 XML 文件,亦或直接讀取磁盤文件,你可以使用任何方式。Django 的任何組成——模型、視圖和模板——都是獨立的。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報電話:173-0602-2364|舉報郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: