django官方文档1.11编翻:1-1-1概述
django概述
因?yàn)閐jango是在快節(jié)奏的編輯環(huán)境下開發(fā)的,它旨在使常見的Web開發(fā)任務(wù)變得快速而簡單。 這是一個(gè)關(guān)于如何用django編寫數(shù)據(jù)庫驅(qū)動(dòng)的Web應(yīng)用程序的非正式概述。
本文檔的目的是為您提供足夠的技術(shù)細(xì)節(jié)來了解django的工作原理,但這不是一個(gè)教程或參考 - 但是我們已經(jīng)有了! 當(dāng)您準(zhǔn)備開始一個(gè)項(xiàng)目時(shí),您可以從教程開始,或者直接進(jìn)入更詳細(xì)的文檔。
設(shè)計(jì)你的模型
盡管您可以在沒有數(shù)據(jù)庫的情況下使用django,但它附帶一個(gè)對象關(guān)系映射器,您可以在其中以python代碼描述數(shù)據(jù)庫布局。
數(shù)據(jù)模型語法提供了許多豐富的代表模型的方法 - 到目前為止,它一直在解決多年的數(shù)據(jù)庫模式問題。 這是一個(gè)快速的例子:
mysite/news/models.py
from django.db import modelsclass Reporter(models.Model):full_name = models.CharField(max_length=70)def __str__(self): # __unicode__ on Python 2 即為在python2的語法中此處應(yīng)該為def __unicode__(self):return self.full_nameclass 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): # __unicode__ on Python 2return self.headline安裝它
接下來,運(yùn)行django命令行實(shí)用程序自動(dòng)創(chuàng)建數(shù)據(jù)庫表:
$ python manage.py migrate其實(shí)在高版本的django中創(chuàng)建數(shù)據(jù)庫表的完整步驟應(yīng)該是,首先在命令窗口進(jìn)入到項(xiàng)目文件的目錄下有manage.py的那一層,先后運(yùn)行:
python manage.py makemigrations # 生成數(shù)據(jù)庫遷移文件 python manage.py migrate # 創(chuàng)建數(shù)據(jù)庫表migrate命令查看所有可用的模型,并在數(shù)據(jù)庫中創(chuàng)建不存在的表以及可選地提供更豐富的模式控制的表。
享受免費(fèi)的API
因此,您有一個(gè)免費(fèi)且豐富的Python API來訪問您的數(shù)據(jù)。 API是即時(shí)創(chuàng)建的,不需要代碼生成:
# Import the models we created from our "news" app >>> from news.models import Reporter, Article# 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()一個(gè)動(dòng)態(tài)的管理界面:它不只是腳手架 - 它是整個(gè)房子
一旦您的模型被定義,Django可以自動(dòng)創(chuàng)建一個(gè)專業(yè)的,生產(chǎn)就緒的管理界面 - 允許經(jīng)過身份驗(yàn)證的用戶添加,更改和刪除對象的網(wǎng)站。 在管理員網(wǎng)站上注冊您的模型非常簡單:
mysite/news/models.py
from django.db import modelsclass 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 adminfrom . import modelsadmin.site.register(models.Article)這里的理念是,您的網(wǎng)站由員工或客戶端編輯,也可能僅僅是您編輯 - 而您不需要處理創(chuàng)建后端接口來管理內(nèi)容。
創(chuàng)建django應(yīng)用程序的一個(gè)典型工作流程是創(chuàng)建模型并盡可能快地讓管理站點(diǎn)運(yùn)行起來,因此您的員工(或客戶端)可以開始填充數(shù)據(jù)。 然后,開發(fā)數(shù)據(jù)呈現(xiàn)給公眾的方式。
設(shè)計(jì)您的網(wǎng)址
一個(gè)干凈,優(yōu)雅的URL方案是高質(zhì)量Web應(yīng)用程序中的重要細(xì)節(jié)。 django鼓勵(lì)漂亮的網(wǎng)址設(shè)計(jì),并不會在URL中放置其他的東西,比如 .php 或 .asp 。
要設(shè)計(jì)應(yīng)用程序的URL,您可以創(chuàng)建一個(gè)名為URLconf的python模塊。 您的應(yīng)用程序的目錄,它包含URL模式和python回調(diào)函數(shù)之間的簡單映射。 URLconfs還用于將URL與python代碼分離。
以下是關(guān)于上面的 Reporter/Article 示例中的URLconf的內(nèi)容:
mysite/news/urls.py
from django.conf.urls import urlfrom . import viewsurlpatterns = [url(r'^articles/([0-9]{4})/$', views.year_archive),url(r'^articles/([0-9]{4})/([0-9]{2})/$', views.month_archive),url(r'^articles/([0-9]{4})/([0-9]{2})/([0-9]+)/$', views.article_detail), ]上面的代碼將URL作為簡單的正則表達(dá)式映射到python回調(diào)函數(shù)("views")的位置。 正則表達(dá)式使用括號來從URL"捕獲"值。 當(dāng)用戶請求頁面時(shí),django按順序運(yùn)行每個(gè)模式,并在與所請求的URL匹配的第一個(gè)模式下停止。(如果沒有匹配,Django會調(diào)用特殊情況的404視圖。)這是非常快的,因?yàn)檎齽t表達(dá)式是在加載時(shí)編譯的。
一旦正則表達(dá)式匹配,django會調(diào)用給定的視圖,這是一個(gè)python函數(shù)。每個(gè)視圖都會傳遞一個(gè)請求對象(包含請求元數(shù)據(jù))以及在正則表達(dá)式中捕獲的值。
例如,如果用戶請求URL "/articles/2005/05/39323/",django將調(diào)用函數(shù)
news.views.article_detail(request, '2005', '05', '39323')。
編寫你的視圖
每個(gè)視圖都負(fù)責(zé)執(zhí)行以下兩項(xiàng)操作之一:返回包含所請求頁面內(nèi)容的HttpResponse對象,或引發(fā)異常(如Http404)。其余的取決于你。
通常,視圖根據(jù)參數(shù)檢索數(shù)據(jù),加載模板并使用檢索到的數(shù)據(jù)呈現(xiàn)模板。以下是上述year_archive的示例視圖:
mysite/news/views.py
from django.shortcuts import renderfrom .models import Articledef 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),它具有幾個(gè)強(qiáng)大的功能,但努力保持足夠簡單以便非程序員使用。
設(shè)計(jì)你的模板
上面的代碼加載了 news/year_archive.html 模板。
django具有模板搜索路徑,可以最大程度地減少模板之間的冗余。在django設(shè)置中,您可以指定使用DIRS檢查模板的目錄列表。如果第一個(gè)目錄中不存在模板,則會檢查第二個(gè)目錄,依此類推。
假設(shè)發(fā)現(xiàn) news/year_archive.html 模板。這可能是這樣的:
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}} 表示"輸出文章headline屬性的值",但是點(diǎn)不僅僅用于屬性查找。他們還可以進(jìn)行字典鍵查找,索引查找和函數(shù)調(diào)用。
注意 {{article.pub_date | date:"F j,Y"}} 使用Unix風(fēng)格的"pipe"("|"字符)。這被稱為模板過濾器,它是一種過濾變量值的方法。在這種情況下,日期過濾器會以給定的格式(同樣可以在PHP的日期函數(shù)中找到)格式化python datetime對象。
您可以將所需的過濾器鏈接在一起。您可以編寫自定義模板過濾器。您可以編寫自定義模板標(biāo)簽,該標(biāo)簽在幕后運(yùn)行自定義的python代碼。
最后,django使用"模板繼承"的概念。這就是 {% extends "base.html" %} 。這意味著"首先加載名為'base'的模板,它定義了一堆塊,并使用以下塊填充塊。"簡而言之,這樣可以大大減少模板中的冗余:每個(gè)模板只能定義該模板有什么獨(dú)特之處。
以下是"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)站的徽標(biāo)),并為子模板填充提供了"洞"。 這使得站點(diǎn)重新設(shè)計(jì)與更改單個(gè)文件(基本模板)一樣簡單。
它還允許您創(chuàng)建多個(gè)版本的站點(diǎn),具有不同的基本模板,同時(shí)重用子模板。django的創(chuàng)作者已經(jīng)使用這種技術(shù)來創(chuàng)建驚人的不同的移動(dòng)版本的網(wǎng)站 - 只需創(chuàng)建一個(gè)新的基本模板。
請注意,如果您喜歡其他系統(tǒng),則不必使用django的模板系統(tǒng)。雖然django的模板系統(tǒng)與django的模型層特別完美地結(jié)合在一起,但是沒有什么會強(qiáng)制你使用它。為此,您不必使用django的數(shù)據(jù)庫API。您可以使用另一個(gè)數(shù)據(jù)庫抽象層,您可以讀取XML文件,您可以從磁盤讀取文件,或任何您想要的內(nèi)容。每個(gè)django - 模型,視圖,模板 - 與下一個(gè)分離。
這只是表面
這只是Django功能的簡要概述。 一些更有用的功能:
與memcached或其他后端集成的緩存框架。
一個(gè)聯(lián)合框架,使得創(chuàng)建RSS和Atom feed與編寫一個(gè)小python類一樣簡單。
更性感自動(dòng)生成的管理功能 - 這個(gè)概述幾乎沒有觸及表面。
下一個(gè)明顯的步驟是為您下載django,閱讀教程并加入社區(qū)。 感謝您的關(guān)注!
總結(jié)
以上是生活随笔為你收集整理的django官方文档1.11编翻:1-1-1概述的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。