13.django入門01(django入門初探視圖,模板,路由)-創(chuàng)新互聯(lián)

一、django的基本使用流程。

創(chuàng)新互聯(lián)建站堅(jiān)持“要么做到,要么別承諾”的工作理念,服務(wù)領(lǐng)域包括:成都做網(wǎng)站、網(wǎng)站建設(shè)、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣等服務(wù),滿足客戶于互聯(lián)網(wǎng)時(shí)代的巨野網(wǎng)站設(shè)計(jì)、移動(dòng)媒體設(shè)計(jì)的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡(luò)建設(shè)合作伙伴!
  1. pip install django #安裝django

  2. 創(chuàng)建一個(gè)project:

     django-admin startproject mysite

    ---mysite

         ---settings.py

         ---url.py

         ---wsgi.py

        ---- manage.py(啟動(dòng)文件)

  3. 給項(xiàng)目起名字:

    python mannage.py startapp  app01

    django-admin.py 是Django的一個(gè)用于管理任務(wù)的命令行工具,manage.py是對django-admin.py的簡單包裝,每一個(gè)Django Project里都會(huì)有一個(gè)mannage.py。

    建一個(gè)django工程 : django-admin.py startproject mysite

     當(dāng)前目錄下會(huì)生成mysite的工程,目錄結(jié)構(gòu)如下:

    13.django入門01(django入門初探視圖,模板,路由)

    manage.py :Django項(xiàng)目里面的工具,通過它可以調(diào)用django shell和數(shù)據(jù)庫等。

    settings.py :包含了項(xiàng)目的默認(rèn)設(shè)置,包括數(shù)據(jù)庫信息,調(diào)試標(biāo)志以及其他一些工作的變量。

    urls.py :負(fù)責(zé)把URL模式映射到應(yīng)用程序。

  4. mysite目錄下創(chuàng)建blog應(yīng)用: python manage.py startapp blog

    13.django入門01(django入門初探視圖,模板,路由)

  5. 注意?。?!一定要將settings.py文件中MIDDLEWARE的'django.middleware.csrf.CsrfViewMiddleware'注釋掉?。。?/p>

  6. 啟動(dòng)一個(gè)django項(xiàng)目:

    python manage.py runserver  127.0.0.1:8080

    這樣我們的django就啟動(dòng)起來了!當(dāng)我們訪問:http://127.0.0.1:8080/  時(shí)就可以看到。

  7. 生成同步數(shù)據(jù)庫的腳本:python manage.py makemigrations

     同步數(shù)據(jù)庫:  python manage.py migrate

    注意:在開發(fā)過程中,數(shù)據(jù)庫同步誤操作之后,難免會(huì)遇到后面不能同步成功的情況,解決這個(gè)問題的一個(gè)簡單粗暴方法是把migrations目錄下,的腳本(除__init__.py之外)全部刪掉,再把數(shù)據(jù)庫刪掉之后創(chuàng)建一個(gè)新的數(shù)據(jù)庫,數(shù)據(jù)庫同步操作再重新做一遍。

  8. 當(dāng)我們訪問http://127.0.0.1:8080/admin/時(shí),會(huì)出現(xiàn):

    13.django入門01(django入門初探視圖,模板,路由)

 所以我們需要為進(jìn)入這個(gè)項(xiàng)目的后臺創(chuàng)建超級管理員:python manage.py createsuperuser,設(shè)置好用戶名和密碼后便可登錄啦!

#admin 是Django 自帶的一個(gè)后臺數(shù)據(jù)庫管理系統(tǒng)。

其他操作:

清空數(shù)據(jù)庫:python manage.py  flush

詢某個(gè)命令的詳細(xì)信息: django-admin.py  help  startapp

啟動(dòng)交互界面 :python manage.py  shell

這個(gè)命令和直接運(yùn)行 python 進(jìn)入 shell 的區(qū)別是:你可以在這個(gè) shell 里面調(diào)用當(dāng)前項(xiàng)目的 models.py 中的 API,對于操作數(shù)據(jù),還有一些小測試非常方便。

終端上輸入python manage.py 可以看到詳細(xì)的列表,在忘記子名稱的時(shí)候特別有用。

二、關(guān)于django配置文件相關(guān)。

  1. 連接數(shù)據(jù)庫。

    DATABASES = {

      'default': {

      'ENGINE': 'django.db.backends.mysql',

      'NAME':'dbname',

      'USER': 'root',

      'PASSWORD': 'xxx',

      'HOST': '',

      'PORT': '',

      }

由于Django內(nèi)部連接MySQL時(shí)使用的是MySQLdb模塊,而python3中還無此模塊,所以需要使用pymysql來代替。

# 如下設(shè)置放置的與project同名的配置的 __init__.py文件中

import pymysql

pymysql.install_as_MySQLdb() 

2.配置模板路徑

TEMPLATE_DIRS = (

    os.path.join(BASE_DIR,'templates'),

  )

3.配置靜態(tài)文件路徑

STATICFILES_DIRS = (

    os.path.join(BASE_DIR,'static'),

  )

三、django的url路由系統(tǒng)相關(guān)。

URL配置(URLconf)就像Django 所支撐網(wǎng)站的目錄。它的本質(zhì)是URL模式以及要為該URL模式調(diào)用的視圖函數(shù)之間的映射表;你就是以這種方式告訴Django,對于這個(gè)URL調(diào)用這段代碼,對于那個(gè)URL調(diào)用那段代碼。

格式:

urlpatterns = [

  url(正則表達(dá)式, views視圖函數(shù),參數(shù),別名),

]

#正則表達(dá)式就沒什么好解釋的了。

#views視圖函數(shù):一個(gè)可調(diào)用對象,通常為一個(gè)視圖函數(shù)或一個(gè)指定視圖函數(shù)路徑的字符串。

#后面的那個(gè)參數(shù),是傳遞給視圖函數(shù)的。(以字典的形式)

  1. 單一路由對應(yīng):

    url(r'^index$', views.index),

  2. 基于正則的路由:

    url(r'^index/(\d*)', views.index),

    url(r'^manage/(?P<name>\w*)/(?P<id>\d*)', views.manage),

  3. 添加額外參數(shù):

    url(r'^manage/(?P<name>\w*)', views.manage,{'id':333}),

  4. 為url路由設(shè)置名稱:

    url(r'^home', views.home, name='h2'),

    url(r'^index/(\d*)', views.index, name='h3'),

    為不同的路由規(guī)則設(shè)置了名稱之后,可以在不同的地方調(diào)用這個(gè)路由規(guī)則:

    比如說模板中,想要在模板中利用這個(gè)規(guī)則生成url:

    模板中使用生成URL   {% url 'h3' 2012 %}

    在一個(gè)函數(shù)中生成url

    reverse('h3', args=(2012,))    路徑:django.urls.reverse

    還可以在model中獲取這個(gè)url:

    class NewType(models.Model):

      caption = models.CharField(max_length=16)

      def get_absolute_url(self):

        """

        為每個(gè)對象生成一個(gè)URL

        應(yīng)用:在對象列表中生成查看詳細(xì)的URL,使用此方法即可?。?!

        :return:

        """

        # return '/%s/%s' % (self._meta.db_table, self.id)

        # 或

        from django.urls import reverse

        return reverse('NewType.Detail', kwargs={'nid': self.id})

四、views視圖函數(shù)。

注意!在創(chuàng)建一個(gè)view視圖函數(shù)之前,這個(gè)函數(shù)一定要接收一個(gè)參數(shù),就是request,這個(gè)參數(shù)中包含了客戶端瀏覽器所有的請求信息??!request這個(gè)參數(shù)就是用來接收HttpRequest對象的!

在發(fā)起一個(gè)http請求時(shí),會(huì)產(chǎn)生兩個(gè)對象:

分別是,http請求(HttpRequest對象)以及http響應(yīng)(HttpResponse對象)

介紹下HttpRequest對象常用的屬性和方法。

1.path:    請求頁面的全路徑,不包括域名。

2.method:   HTTP請求方法,以字符串標(biāo)識(全大寫)例如:

if  req.method=="GET":

        do_something()

if req.method=="POST":

         do_something_else()

3.GET:  包含所有HTTP GET參數(shù)的類字典對象

4.POST:包含所有HTTP POST參數(shù)的類字典對象

補(bǔ)充?。悍?wù)器收到空的POST請求的情況也是可能發(fā)生的,也就是說,表單form通過,HTTP POST方法提交請求,但是表單中可能沒有數(shù)據(jù),因此不能使用if req.POST來判斷是否使用了HTTP POST 方法;應(yīng)該使用  if req.method=="POST"。

注意一個(gè)常用方法:request.POST.getlist('')

5.COOKIES:   包含所有cookies的標(biāo)準(zhǔn)Python字典對象;keys和values都是字符串。

6.FILES:    包含所有上傳文件的類字典對象;FILES中的每一個(gè)Key都是<input type="file" name="" />標(biāo)簽中           name屬性的值,F(xiàn)ILES中的每一個(gè)value同時(shí)也是一個(gè)標(biāo)準(zhǔn)的python字典對象,包含下面三個(gè)Keys:

filename:    上傳文件名。

content_type:  上傳文件的Content Type。

content:    上傳文件的原始內(nèi)容。

6.user:    是一個(gè)django.contrib.auth.models.User對象,代表當(dāng)前登陸的用戶。如果訪問用戶當(dāng)前沒有登陸,user將被初始化為django.contrib.auth.models.AnonymousUser的實(shí)例,你可以通過user的is_authenticated()方法來辨別用戶是否登陸:if req.user.is_authenticated()

(只有激活Django中的AuthenticationMiddleware時(shí)該屬性才可用)

7. session:   唯一可讀寫的屬性,代表當(dāng)前會(huì)話的字典對象;自己有激活Django中的session支持時(shí)該屬性才可用。

HttpResponse對象常用的方法和屬性介紹:

對于HttpRequest對象來說,是由django自動(dòng)創(chuàng)建的,但是,HttpResponse對象就必須我們自己創(chuàng)建。每個(gè)view請求處理方法必須返回一個(gè)HttpResponse對象。

#HttpResponse類在django.http.HttpResponse中。

在HttpResponse對象上擴(kuò)展的常用方法:

#return HttpResponse('<input type='text' />')( 只能返回字符串對象!不推薦使用?。?/p>

return render(request,'index.html')(推薦)(直接返回一個(gè)html文檔,第一個(gè)參數(shù)是視圖函數(shù)收到的httprequest對象,第二個(gè)參數(shù)是html文檔的文件名,還需要補(bǔ)充一點(diǎn),就是,這個(gè)文件名會(huì)到指定的路徑下去查找,這個(gè)路徑是配置文件中已經(jīng)寫好的配置文件名為settings.py)

#render里面2還可以傳第三個(gè)參數(shù),這個(gè)參數(shù)就是模板標(biāo)記!

TEMPLATES = [

  {

    'BACKEND': 'django.template.backends.django.DjangoTemplates',

    'DIRS': [os.path.join(BASE_DIR, 'templates')]

補(bǔ)充!在使用render之前需要:from django.shortcuts import HttpResponse,render

return redirect(“要跳轉(zhuǎn)的url”) #用來做地址跳轉(zhuǎn)!

五、關(guān)于Template基礎(chǔ) 。

模板語法:

1.變量(使用雙大括號來引用變量)。

語法格式:  `var_name`

2.使用.點(diǎn)號來進(jìn)行變量中數(shù)據(jù)的深度查找。

在到目前為止的例子中,我們通過 context 傳遞的簡單參數(shù)值主要是字符串,然而,模板系統(tǒng)能夠非常簡潔地處理更加復(fù)雜的數(shù)據(jù)結(jié)構(gòu),例如list、dictionary和自定義的對象。

#在 Django 模板中遍歷復(fù)雜數(shù)據(jù)結(jié)構(gòu)的關(guān)鍵是句點(diǎn)字符 (.)。

例子1:訪問模板變量中的列表中的元素。

在python中如果想訪問列表中的數(shù)據(jù)需要使用索引去訪問。

在django的模板中,也支持索引的方式,就是用.(點(diǎn)號)。

>>> from django.template import Template, Context

>>> t = Template('Item two is ` items`.`2 `.')  #item這個(gè)變量中包含的是個(gè)列表,后面的(.2)點(diǎn)2就是取出列表中的第2個(gè)元素(和python中一樣,元素的索引是從第0個(gè)開始。)

>>> c = Context({'items': ['value1', 'value2', 'value3']})

>>> t.render(c)

'Item 2 is value3.'

例子2:假設(shè)你要向模板傳遞一個(gè) Python 字典。 要通過字典鍵訪問該字典的值,也可以通過.點(diǎn)號去取字典中的value。

>>> from django.template import Template, Context

>>> person = {'name': 'bi**h jolin'', 'age': '130'}

>>> t = Template('` person`.`name ` is ` person`.`age ` years old.')

>>> c = Context({'person': person})

>>> t.render(c)

'bi**h jolin is 130 years old.'

例子3:點(diǎn)號在django的模板中還有一個(gè)功能,就是訪問一個(gè)對象的屬性。

比如說, Python 的 datetime.date 對象有year 、 month 和 day 幾個(gè)屬性,你同樣可以在模板中使用句點(diǎn)來訪問這些屬性。

>>> from django.template import Template, Context

>>> import datetime

>>> d = datetime.date(1993, 5, 2)

>>> d.year

1993

>>> d.month

5

>>> d.day

2

>>> t = Template('The month is ` date`.`month ` and the year is ` date`.`year `.')

>>> c = Context({'date': d})

>>> t.render(c)

'The month is 5 and the year is 1993.'

例子4:在一個(gè)自定義的類中,通過對象后面加上點(diǎn)號,來訪問這個(gè)對象的某個(gè)屬性。

>>> from django.template import Template, Context

>>> class Person(object):

...   def __init__(self, first_name, last_name):

...     self.first_name, self.last_name = first_name, last_name

>>> t = Template('Hello, ` person`.`first_name ` ` person`.`last_name `.')

>>> c = Context({'person': Person('bitch', 'jolin')})

>>> t.render(c)

'Hello, bitch jolin.'

點(diǎn)號是可以調(diào)用python內(nèi)部所有對象的屬性或者方法的?。?!這點(diǎn)特別靈活?。?!

>>> from django.template import Template, Context

>>> t = Template('` var ` -- ` var`.`upper ` -- ` var`.`isdigit `')

>>> t.render(Context({'var': 'hello'}))

'hello -- HELLO -- False'

>>> t.render(Context({'var': '123'}))

'123 -- 123 -- True'

but??!注意這里調(diào)用方法時(shí)并* 沒有* 使用圓括號 而且也無法給該方法傳遞參數(shù);你只能調(diào)用不需參數(shù)的?。?!

3.模板中變量的過濾器(filter):

語法格式:    {{obj|filter:param}}

3.1 add 給一個(gè)變量值做加法。

{{ value2|add:3 }}<br>

此時(shí)value2=5。

3.2addslashes  給變量中的引號前加斜線。

3.3capfirst   首字母大寫。

3.4 cut  從字符串中移除指定的字符。

{{ value3|cut:' ' }}<br> #以空行為分隔符

value3='he  llo wo r ld'

3.5  date    格式化日期字符串。

import datetime

value4=datetime.datetime.now()

{{ value4|date:'Y-m-d' }}<br>

3.6 default   如果值是False,就替換成設(shè)置的默認(rèn)值,否則就是用本來的值。

{{ value5|default:'空的' }}<br>

#value5=[]

3.7 default_if_none:  如果值是None,就替換成設(shè)置的默認(rèn)值,否則就使用本來的值。

3.8 對a標(biāo)簽進(jìn)行操作:

value6='<a href="#">跳轉(zhuǎn)</a>'

{{ value6|safe }}<br> #如果外面包了其他的標(biāo)簽,比如說h2標(biāo)簽,讓瀏覽器強(qiáng)制解釋為A標(biāo)簽。

3.8字符串操作:

#value7='1234'

{{ value7|filesizeformat }}<br>

{{ value7|first }}<br> #取字符串的第一個(gè)字符

{{ value7|length }}<br> #取字符串的長度

{{ value7|slice:":-1" }}<br>  #切片

4.模板中簽(tag)的使用(使用大括號和百分比的組合來表示使用tag)

格式:{% tags %}

4.1 if判斷標(biāo)簽:{% if %}

{% if %}標(biāo)簽計(jì)算一個(gè)變量值,如果是“true”,即它存在、不為空并且不是false的boolean值,系統(tǒng)則會(huì)顯示{% if %}和{% endif %}間的所有內(nèi)容。

例1:

{% if num >= 100 and 8 %}

  {% if num > 200 %}

    <p>num大于200</p>

  {% else %}

    <p>num大于100小于200</p>

  {% endif %}

{% elif num < 100%}

  <p>num小于100</p>

{% else %}

  <p>num等于100</p>

{% endif %}

注意?。?!

{% if %} 標(biāo)簽接受and,or或者not來測試多個(gè)變量值或者否定一個(gè)給定的變量

{% if %} 標(biāo)簽不允許同一標(biāo)簽里同時(shí)出現(xiàn)and和or,否則邏輯容易產(chǎn)生歧義?。。?!

4.2 for循環(huán)判斷標(biāo)簽:{% for %}

{% for %}標(biāo)簽允許你按順序遍歷一個(gè)序列中的各個(gè)元素,每次循環(huán)模板系統(tǒng)都會(huì)渲染{% for %}和{% endfor %}之間的所有內(nèi)容。

<ul>

{% for obj in list %}

  <li>` obj`.`name `</li>

{% endfor %}

</ul>

反向循環(huán):

django模板還支持在標(biāo)簽里添加reversed來反序循環(huán)列表:

語法格式如下。

  {% for obj in list reversed %}

  ...

  {% endfor %}

for循環(huán)標(biāo)簽也是可以嵌套的:

  {% for country in countries %}

    <h2>` country`.`name `</h2>

    <ul>

     {% for city in country.city_list %}

      <li>` city `</li>

     {% endfor %}

    </ul>

  {% endfor %}

注意??!django模板中的for循環(huán)不支持continue和break?。?/p>

{% for %}標(biāo)簽內(nèi)置了一個(gè)forloop模板變量,這個(gè)變量含有一些屬性可以提供給你一些關(guān)于循環(huán)的信息。

forloop.counter表示循環(huán)的次數(shù),它從1開始計(jì)數(shù),第一次循環(huán)設(shè)為1

 {% for item in todo_list %}

    <p>` forloop`.`counter `: ` item `</p>

  {% endfor %}

forloop.counter0 功能與forloop.counter是一樣的,但它是從0開始計(jì)數(shù),第一次循環(huán)設(shè)為0。

forloop.revcounter 倒序計(jì)數(shù),一直到1

forloop.revcounter0 倒序計(jì)數(shù),一直到0

forloop.first當(dāng)?shù)谝淮窝h(huán)時(shí)值為True。

應(yīng)用場景:

 {% for object in objects %}

     {% if forloop.first %}<li class="first">{% else %}<li>{% endif %}

     ` object `

    </li>

  {% endfor %}

注意!forloop變量只能在循環(huán)中得到,當(dāng)模板解析器到達(dá){% endfor %}時(shí)forloop就會(huì)失去作用。

當(dāng)本次循環(huán)取不到值時(shí),執(zhí)行{% empty %}標(biāo)簽下的操作:

`li `

   {%  for i in li %}

     <li>` forloop`.`counter0 `----` i `</li>

   {% empty %}

     <li>this is empty!</li>

   {% endfor %}

 

4.3{%csrf_token%}:csrf_token標(biāo)簽(一種安全機(jī)制)。

用于生成csrf_token的標(biāo)簽,用于防治跨站***驗(yàn)證。注意如果你在view的index里用的是render_to_response方法,不會(huì)生效。

原理就是會(huì)生成一個(gè)input標(biāo)簽,和其他表單標(biāo)簽一起提交給后臺的。

4.4{% with %}:用更簡單的變量名替代復(fù)雜的變量名.

{% with total=fhjsaldfhjsdfhlasdfhljsdal %} ` total ` {% endwith %}

這個(gè)變量名只在with標(biāo)簽中生效!

4.5{% verbatim %}: 禁止render,模板中的變量不會(huì)被解析。

{% verbatim %}

     ` hello `

{% endverbatim %}

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)cdcxhl.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。

網(wǎng)站標(biāo)題:13.django入門01(django入門初探視圖,模板,路由)-創(chuàng)新互聯(lián)
網(wǎng)頁網(wǎng)址:http://bm7419.com/article36/ddpgsg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供響應(yīng)式網(wǎng)站品牌網(wǎng)站建設(shè)、手機(jī)網(wǎng)站建設(shè)、網(wǎng)站改版、網(wǎng)站設(shè)計(jì)、虛擬主機(jī)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

網(wǎng)站托管運(yùn)營