理解上下文
render(request,x.html,context)
request:請求的固定寫法硅急。
x.html:模板覆享,需要填補(bǔ)丁的模板。
context:上下文,填充模板的補(bǔ)丁营袜。
模板的使用流程
- 寫模板撒顿,創(chuàng)建Template對象,用模板語言進(jìn)行修改荚板。
- 創(chuàng)建Context凤壁,context是一組字典,用來傳遞數(shù)據(jù)給Template對象跪另。
- 調(diào)用Template對象的render()方法傳遞context來填充模板拧抖。
創(chuàng)建并使用模板
- 單獨(dú)創(chuàng)建templates、staitc文件夾免绿,將之前寫的前端文件如何放入Django項(xiàng)目唧席。
- 網(wǎng)頁放入tempaltes,所有的靜態(tài)文件放入static中嘲驾。(靜態(tài)文件是指網(wǎng)站中的 js, css, 圖片淌哟,視頻等)
- 修改setting,TEMPLATES距淫,DIRS:[os.path.join(BASE_DIR,'templates').replace('\','/')], (注意逗號不能夠少)
- html最上方加入{% load staticfiles %},在模板中引入靜態(tài)文件绞绒,修改模板中的固定地址改為動態(tài)地址。({% static 'css/semantic.css' %})
模板語言
模板語言分為:模板變量榕暇,模板標(biāo)簽蓬衡,模板過濾器。
模板變量:
{{ value }},{{ Person.name }}
模板標(biāo)簽:
{% for item in list %}
{{ item }}
{% endfor %}
{% for key, value in dict.items %}
{{ key }}: {{ value }}
{% endfor %}
{% if today_is_weekend %}
<p>Welcome to the weekend!</p>
{% else %}
<p>Get back to work.</p>
{% endif %}
注:標(biāo)簽可以多重進(jìn)行嵌套彤枢。
其他:
{% forloop.first %}是一個布爾值狰晚。在第一次執(zhí)行循環(huán)時該變量為True
{% forloop.last %}是一個布爾值;在最后一次執(zhí)行循環(huán)時被置為True缴啡。
模板過濾器:
{{ value|default:"nothing" }} 如果為空則顯示nothing的樣式壁晒。
{{ value|truncatewords:200 }} 只顯示前200個字符。
{{ name|lower }} 功能是轉(zhuǎn)換文本為小寫业栅。
案例
使用 django 的'日期字段'給每篇文章添加類似圖中的一個發(fā)布日期秒咐,格式是「2016-11-05」
model增加:
class Aritcle(models.Model):
date = models.DateField(auto_now=True)
html增加:
<span class="grey">{{ article.date|date:"Y-m-d" }}</span>
模板繼承
extends標(biāo)簽
定義一個父模板為base.html,寫出HTML的骨架谬晕,將需要子塊修改的地方用{% block %}{% endblock %}標(biāo)出。
子模板使用{% extends "base.html" %}將內(nèi)容填寫進(jìn)這些空白的內(nèi)容塊携取。
模板繼承允許你建立一個基本的”骨架”模板, 它包含你所有最常用的站點(diǎn)元素并定義了一些可以被子模板覆蓋的block攒钳。
如果你需要在子模板中引用父模板中的 block 的內(nèi)容,使用 “{{ block.super }}“ 變量.這在你希望在父模板的內(nèi)容之后添加一些內(nèi)容時會很有用.(你不必完全覆蓋父模板的內(nèi)容.)
include標(biāo)簽
{% include %}該標(biāo)簽允許在(模板中)包含其它的模板的內(nèi)容。
標(biāo)簽的參數(shù)是所要包含的模板名稱雷滋,可以是一個變量不撑,也可以是用單/雙引號硬編碼的字符串。
每當(dāng)在多個模板中出現(xiàn)相同的代碼時晤斩,就應(yīng)該考慮是否要使用 {% include %} 來減少重復(fù)焕檬。
- stackoverflow問題:{% include %} vs {% extends %} in django templates?
Extending allows you to replace blocks (e.g. "content") from a parent template instead of including parts to build the page (e.g. "header" and "footer"). This allows you to have a single template containing your complete layout and you only "insert" the content of the other template by replacing a block.
If the user profile is used on all pages, you'd probably want to put it in your base template which is extended by others or include it into the base template. If you wanted the user profile only on very few pages, you could also include it in those templates. If the user profile is the same except on a few pages, put it in your base template inside a block which can then be replaced in those templates which want a different profile.
模板注釋
注釋使用{# #}注釋不能跨多行 eg: {# This is a comment #}
urls相關(guān)
urls中定義鏈接(三種)
Function views
Add an import: from my_app import views
Add a URL to urlpatterns: url(r'^$', views.home, name='home')
Class-based views
Add an import: from other_app.views import Home
Add a URL to urlpatterns: url(r'^$', Home.as_view(), name='home')
Including another URLconf
Import the include() function: from django.conf.urls import url, include
Add a URL to urlpatterns: url(r'^blog/', include('blog.urls'))
url的name屬性
url(r'^add/$', calc_views.add, name='add'),
這里的name可以用于在 templates, models, views ……中得到對應(yīng)的網(wǎng)址澳泵,相當(dāng)于“給網(wǎng)址取了個名字”实愚,只要這個名字不變,網(wǎng)址變了也能通過名字獲取到烹俗。
url正則表達(dá)式
url(r'^(?P<year>\d{4})/(?P<month>\d{1,2})/$','get_news_list',name="news_archive" )
<year> <month> 在view的參數(shù)獲得 如:def index(request,year,month)
url的include用法
(r'^weblog/', include('mysite.blog.urls')),
(r'^photos/', include('mysite.photos.urls')),
指向include()的正則表達(dá)式并不包含一個$(字符串結(jié)尾匹配符)爆侣。每當(dāng)Django 遇到include()時,它將截?cái)嗥ヅ涞腢RL幢妄,并把【剩余】的字符串發(fā)往被包含的 URLconf 作進(jìn)一步處理兔仰。
創(chuàng)建使用后臺
使用django自帶的后臺,可以可視化管理后臺的數(shù)據(jù)蕉鸳。
創(chuàng)建超級管理員
python manage.py createsuperuser # 設(shè)置用戶名乎赴,密碼。
注冊自定義model
from models import People
admin.site.register(People)
修改顯示字段
管理后臺默認(rèn)顯示People Obejct潮尝,在model中添加返回值方法榕吼,修改顯示效果。
def __str__(self):
return self.name
修改后臺密碼的方法
python manage.py createsuperuser --username admin
python manage.py changepassword admin
admin顯示自定義字段
from django.contrib import admin
from .models import Article
class ArticleAdmin(admin.ModelAdmin):
list_display = ('title','pub_date','update_time',)
admin.site.register(Article,ArticleAdmin)
引入數(shù)據(jù)
Django ORM對數(shù)據(jù)庫進(jìn)行操作勉失,數(shù)據(jù)庫操作完成之后羹蚣,記得要進(jìn)行save()保存。
數(shù)據(jù)庫操作
Article.objects.all() 獲取表中所有對象
Aritcle.objects.get(pk=1) # Django中pk=primary key,和id等價乱凿。
Article.objects.filter(pub_date__year=2006) # 使用過濾器獲取特定對象
Article.objects.all().filter(pub_date__year=2006) #與上方一致
## 鏈?zhǔn)竭^濾
>>> Aritcle.objects.filter(
... headline__startswith='What'
... ).exclude(
... pub_date__gte=datetime.date.today()
... ).filter(
... pub_date__gte=datetime(2005, 1, 30)
... )
Article.objects.create(author=me, title='Sample title', text='Test') #創(chuàng)建對象
Person.objects.get_or_create(name="WZT", age=23) # 防止重復(fù)很好的方法
Article.objects.all()[:5] 記錄前5條
Person.objects.all().reverse()[:2] # 最后兩條
Person.objects.all().reverse()[0] # 最后一條
>>> Post.objects.filter(title__contains='title') # 包含查詢
[<Post: Sample title>, <Post: 4th title of post>]
# 注在title與contains之間有兩個下劃線字符 (_)顽素。
# Django的ORM使用此語法來分隔字段名稱 ("title") 和操作或篩選器("contains")。
Post.objects.order_by('-created_date') # 對象進(jìn)行排序徒蟆,默認(rèn)升序胁出,添負(fù)號為降序。
Person.objects.filter(name__iexact="abc") # 不區(qū)分大小寫
Person.objects.filter(name__exact="abc") # 嚴(yán)格等于
Person.objects.filter(name__regex="^abc") # 正則表達(dá)式
Person.objects.filter(name__iregex="^abc") # 不區(qū)分大小寫
Person.objects.exclude(name__contains="WZ") # 排除
Person.objects.filter(name__contains="abc").exclude(age=23
#找出名稱含有abc, 但是排除年齡是23歲的
QuerySet創(chuàng)建對象的四種方法
Author.objects.create(name="WeizhongTu", email="tuweizhong@163.com
twz = Author(name="WeizhongTu", email="tuweizhong@163.com")
twz.save()
twz = Author()
twz.name="WeizhongTu"
twz.email="tuweizhong@163.com"
Author.objects.get_or_create(name="WeizhongTu", email="tuweizhon“)
# 返回值(object, True/False)
QuerySet是可迭代的
es = Entry.objects.all()
for e in es:
print(e.headline)
檢查對象是否存在
Entry.objects.all().exists() 返回布爾值
拓展閱讀:
課堂操作內(nèi)容文檔
備注
該筆記源自網(wǎng)易微專業(yè)《Python web開發(fā)》1.2節(jié)
本文由EverFighting創(chuàng)作,采用 知識共享署名 3.0 中國大陸許可協(xié)議進(jìn)行許可段审。