一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

初識 Django | Django 文檔 | Django

 寧靜致遠(yuǎn)oj1kn5 2019-06-13

初識 Django?

Django 最初被設(shè)計用于具有快速開發(fā)需求的新聞類站點,目的是要實現(xiàn)簡單快捷的網(wǎng)站開發(fā)。以下內(nèi)容簡要介紹了如何使用 Django 實現(xiàn)一個數(shù)據(jù)庫驅(qū)動的 Web 應(yīng)用。

為了讓您充分理解 Django 的工作原理,這份文檔為您詳細(xì)描述了相關(guān)的技術(shù)細(xì)節(jié),不過這并不是一份入門教程或者是參考文檔(我們當(dāng)然也為您準(zhǔn)備了這些)。如果您想要馬上開始一個項目,可以從 實例教程 開始入手,或者直接開始閱讀詳細(xì)的 參考文檔

設(shè)計模型?

Django 無需數(shù)據(jù)庫就可以使用,它提供了 對象關(guān)系映射器 通過此技術(shù),你可以使用 Python 代碼來描述數(shù)據(jù)庫結(jié)構(gòu)。

你可以使用強大的 數(shù)據(jù)-模型語句 來描述你的數(shù)據(jù)模型,這解決了數(shù)年以來在數(shù)據(jù)庫模式中的難題。以下是一個簡明的例子:

mysite/news/models.py?
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

應(yīng)用數(shù)據(jù)模型?

然后,運行 Django 命令行工具來創(chuàng)建數(shù)據(jù)庫表:

$ python manage.py migrate
...\> py manage.py migrate

這個 migrate 命令查找你所有可用的模型并將在數(shù)據(jù)庫中創(chuàng)建那些不存在的表,還可提供了可選的 豐富 schema 控制。

享用便捷的 API?

接下來,你就可以使用一套便捷而豐富的 Python API 訪問你的數(shù)據(jù)。這些 API 是即時創(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()

一個動態(tài)管理接口:并非徒有其表?

當(dāng)你的模型完成定義,Django 就會自動生成一個專業(yè)的生產(chǎn)級 管理接口 ——一個允許認(rèn)證用戶添加、更改和刪除對象的 Web 站點。你只需簡單的在 admin 站點上注冊你的模型即可:

mysite/news/models.py?
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)
mysite/news/admin.py?
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ù)。

規(guī)劃 URLs?

簡潔優(yōu)雅的 URL 規(guī)劃對于一個高質(zhì)量 Web 應(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 的例子:

mysite/news/urls.py?
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ù)標(biāo)簽從URL中“捕獲”相應(yīng)值。當(dāng)用戶請求頁面時,Django 依次遍歷路徑,直至初次匹配到了請求的 URL。(如果無匹配項,Django 會調(diào)用 404 視圖。) 這個過程非???,因為路徑在加載時就編譯成了正則表達式。

一旦有 URL 路徑匹配成功,Django 會調(diào)用相應(yīng)的視圖函數(shù)。每個視圖函數(shù)會接受一個請求對象——包含請求元信息——以及在匹配式中獲取的參數(shù)值。

例如,當(dāng)用戶請求了這樣的 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 的視圖樣例:

mysite/news/views.py?
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) ,它有著很多強大的功能,而且使用起來足夠簡單,即使不是程序員也可輕松使用。

設(shè)計模板?

上面的代碼加載了 news/year_archive.html 模板。

Django 允許設(shè)置搜索模板路徑,這樣可以最小化模板之間的冗余。在 Django 設(shè)置中,你可以通過 DIRS 參數(shù)指定一個路徑列表用于檢索模板。如果第一個路徑中不包含任何模板,就繼續(xù)檢查第二個,以此類推。

讓我們假設(shè) news/year_archive.html 模板已經(jīng)找到。它看起來可能是下面這個樣子:

mysite/news/templates/news/year_archive.html?
{% 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 風(fēng)格的“管道符”(“|”字符)。這是一個模板過濾器,用于過濾變量值。在這里過濾器將一個 Python datetime 對象轉(zhuǎn)化為指定的格式(就像 PHP 中的日期函數(shù)那樣)。

你可以將多個過濾器連在一起使用。你還可以使用你 自定義的模板過濾器 。你甚至可以自己編寫 自定義的模板標(biāo)簽 ,相關(guān)的 Python 代碼會在使用標(biāo)簽時在后臺運行。

Django 使用了 ''模板繼承'' 的概念。這就是 {% extends "base.html" %} 的作用。它的含義是''先加載名為 base 的模板,并且用下面的標(biāo)記塊對模板中定義的標(biāo)記塊進行填充''。簡而言之,模板繼承可以使模板間的冗余內(nèi)容最小化:每個模板只需包含與其它文檔有區(qū)別的內(nèi)容。

下面是 base.html 可能的樣子,它使用了 靜態(tài)文件

mysite/templates/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>

簡而言之,它定義了這個網(wǎng)站的外觀(利用網(wǎng)站的 logo),并且給子模板們挖好了可以填的”坑“。這也讓網(wǎng)站的改版變得簡單無比——你只需更改這個根模板文件即可。

它還可以讓你利用不同的基礎(chǔ)模板并重用子模板創(chuàng)建一個網(wǎng)站的多個版本。Django 的創(chuàng)建者已經(jīng)利用這一技術(shù)來創(chuàng)造了明顯不同的手機版本的網(wǎng)站——只需創(chuàng)建一個新的基礎(chǔ)模板。

注意,你并不是非得使用 Django 的模板系統(tǒng),你可以使用其它你喜歡的模板系統(tǒng)。盡管 Django 的模板系統(tǒng)與其模型層能夠集成得很好,但這不意味著你必須使用它。同樣,你可以不使用 Django 的數(shù)據(jù)庫 API。你可以用其他的數(shù)據(jù)庫抽象層,像是直接讀取 XML 文件,亦或直接讀取磁盤文件,你可以使用任何方式。Django 的任何組成——模型、視圖和模板——都是獨立的。

這僅是基本入門知識?

以上只是 Django 的功能性概述。Django 還有更多實用的特性:

  • 緩存框架 可以與 memcached 或其它后端集成。
  • 聚合器框架 可以通過簡單編寫一個 Python 類來推送 RRS 和 Atom。
  • 功能豐富的自動生成的后臺——這份概要只是簡單介紹了下。

接下來您可以 下載 Django ,閱讀 實例教程 ,然后加入我們的 社區(qū) !感謝您的關(guān)注!

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多

    久久女同精品一区二区| 99日韩在线视频精品免费| 色播五月激情五月婷婷| 欧美胖熟妇一区二区三区| 国产原创中文av在线播放| 国产日本欧美特黄在线观看| 美女被后入福利在线观看| 久久成人国产欧美精品一区二区| 久草精品视频精品视频精品| 日本丁香婷婷欧美激情| 色婷婷中文字幕在线视频| 国产一区二区不卡在线视频| 日韩蜜桃一区二区三区| 午夜国产精品福利在线观看| 在线中文字幕亚洲欧美一区| 国产又猛又黄又粗又爽无遮挡 | 精品al亚洲麻豆一区| 激情亚洲内射一区二区三区| 九九热在线视频观看最新| 91欧美一区二区三区成人| 亚洲中文字幕人妻系列| 大香蕉久草网一区二区三区| 高清免费在线不卡视频| 中文字幕欧美精品人妻一区| 午夜精品一区二区三区国产| 好吊妞视频免费在线观看| 东京热加勒比一区二区| 成人精品国产亚洲av久久| 日本办公室三级在线观看| 久久99精品国产麻豆婷婷洗澡| 日韩在线一区中文字幕| 国产成人国产精品国产三级| 青草草在线视频免费视频| 在线免费观看黄色美女| a久久天堂国产毛片精品| 日韩中文字幕在线不卡一区| 日本一区二区三区久久娇喘| 亚洲国产成人久久99精品| 国产水滴盗摄一区二区| 亚洲天堂有码中文字幕视频| 视频一区日韩经典中文字幕|