Django 基本

Django安裝 row15css

錯誤參考 row 460html

項目參考 row280前端

models類型參考python

模板標籤 row 410mysql

Templates 前端調整git

字符串轉換爲字典web

 

 

Django

 

可直接下載源碼進行安裝正則表達式

Linux直接用yum install python-django -y 安裝算法

直接用pip install Django 安裝sql

 

 

檢查是否安裝成功:

 

Python下輸入:

 

>>> import django

>>> django.VERSION

(1, 9, 7, 'final', 0)

>>> django.get_version()

'1.9.7'

>>>

-------------------------------------------------------------------------------------

經確認是新版本的django包版本中只有zh_Hans目錄,沒有zh_CN,zh_Hans目錄複製一個zh_CNOk

一樓評論的方法也不錯,在settings裏面直接改爲zh-Hans,這樣就不用升級完Django,還去改目錄了。

-------------------------------------------------------------------------------------

 

讓咱們一覽 Django 全貌

urls.py

網址入口,關聯到對應的views.py中的一個函數(或者generic類),訪問網址就對應一個函數。

views.py

處理用戶發出的請求,從urls.py中對應過來, 經過渲染templates中的網頁能夠將顯示內容,好比登錄後的用戶名,用戶請求的數據,輸出到網頁。

models.py

與數據庫操做相關,存入或讀取數據時用到這個,固然用不到數據庫的時候 你能夠不使用。

forms.py

表單,用戶在瀏覽器上輸入數據提交,對數據的驗證工做以及輸入框的生成等工做,固然你也能夠不使用。

templates 文件夾

views.py 中的函數渲染templates中的Html模板,獲得動態內容的網頁,固然能夠用緩存來提升速度。

admin.py

後臺,能夠用不多量的代碼就擁有一個強大的後臺。

settings.py

Django 的設置,配置文件,好比 DEBUG 的開關,靜態文件的位置等。

 

-------------------------------------------------------------------------------------------------------------------------

 

1. 新建一個 django project

django-admin.py startproject project-name

一個 project 爲一個項目,project-name 項目名稱,改爲你本身的,要符合Python 的變量命名規則(如下劃線或字母開頭)

2. 新建 app

python manage.py startapp app-name

django-admin.py startapp app-name

通常一個項目有多個app, 固然通用的app也能夠在多個項目中使用。

3. 同步數據庫

python manage.py syncdb

注意:Django 1.7.1及以上的版本須要用如下命令

python manage.py makemigrations

python manage.py migrate -----------------------1.9可用

 

這種方法能夠建立表,當你在models.py中新增了類時,運行它就能夠自動在數據庫中建立表了,不用手動建立。

備註:對已有的 models 進行修改,Django 1.7以前的版本的Django都是沒法自動更改表結構的,不過有第三方工具 south,詳見 Django 數據庫遷移(http://www.ziqiangxuetang.com/django/django-data-migration.html) 一節。

對於1.7後的調整,可將以前的字段設置容許爲空 null=True,而後再經過 python manage.py makemigrations/python manage.py migrate  更新數據庫。

4. 使用開發服務器

python manage.py runserver

Performing system checks...

 

System check identified no issues (0 silenced).

July 21, 2016 - 09:54:16

Django version 1.9.7, using settings 'dj_test.settings'

Starting development server at http://127.0.0.1:8000/

Quit the server with CTRL-BREAK.

 

# 當提示端口被佔用的時候,能夠用其它端口:

python manage.py runserver 8001

python manage.py runserver 9999

(固然也能夠kill掉佔用端口的進程)

 

# 監聽全部可用 ip (電腦可能有一個或多個內網ip,一個或多個外網ip,即有多個ip地址)

python manage.py runserver 0.0.0.0:8000

# 若是是外網或者局域網電腦上能夠用其它電腦查看開發服務器

# 訪問對應的 ip加端口,好比 http://172.16.20.2:8000

5. 清空數據庫

python manage.py flush

此命令會詢問是 yes 仍是 no, 選擇 yes 會把數據所有清空掉,只留下空表。

6. 建立超級管理員

python manage.py createsuperuser

# 按照提示輸入用戶名和對應的密碼就行了郵箱能夠留空,用戶名和密碼必填

# 修改 用戶密碼能夠用:

python manage.py changepassword username

7. 導出數據 導入數據

python manage.py dumpdata appname > appname.json

python manage.py loaddata appname.json

關於數據操做 詳見:數據導入數據遷移(http://www.ziqiangxuetang.com/django/django-data-migration.html),如今瞭解有這個用法就能夠了。

8. Django 項目環境終端

python manage.py shell

若是你安裝了 bpython ipython 會自動用它們的界面,推薦安裝 bpython

這個命令和 直接運行 python bpython 進入 shell 的區別是:你能夠在這個 shell 裏面調用當前項目的 models.py 中的 API,對於操做數據,還有一些小測試很是方便。

9. 數據庫命令行

python manage.py dbshell

Django 會自動進入在settings.py中設置的數據庫,若是是 MySQL postgreSQL,會要求輸入數據庫用戶密碼。

在這個終端能夠執行數據庫的SQL語句。若是您對SQL比較熟悉,可能喜歡這種方式。

10. 更多命令

終端上輸入 python manage.py 能夠看到詳細的列表,在忘記子名稱的時候特別有用。

Django 視圖與網址

-------------------------------------------------------------

 

Django中網址是寫在 urls.py 文件中,用正則表達式對應 views.py 中的一個函數(或者generic),咱們用一個項目來演示。

一,首先,新建一個項目(project), 名稱爲 mysite

django-admin startproject mysite

運行後,若是成功的話, 咱們會看到以下的目錄樣式

mysite

├── manage.py

└── mysite

    ├── __init__.py

    ├── settings.py

    ├── urls.py

    └── wsgi.py

, 新建一個應用(app), 名稱叫 learn

python manage.py startapp learn # learn 是一個app的名稱

咱們能夠看到mysite中多個一個 learn 文件夾,其中有如下文件。

learn/

├── __init__.py

├── admin.py

├── models.py

├── tests.py

└── views.py

注:Django 1.8.x 以上的,還有一個 migrations 文件夾。Django 1.9.x 還會在 Django 1.8 的基礎上多出一個 apps.py 文件。可是這些都與本文無關。

把咱們新定義的app加到settings.py中的INSTALL_APPS

修改 mysite/mysite/settings.py

INSTALLED_APPS = (

    'django.contrib.admin',

    'django.contrib.auth',

    'django.contrib.contenttypes',

    'django.contrib.sessions',

    'django.contrib.messages',

    'django.contrib.staticfiles',

    'learn',

)

備註,這一步是幹什麼呢? 新建的 app 若是不加到 INSTALL_APPS 中的話, django 就不能自動找到app中的模板文件(app-name/templates/下的文件)和靜態文件(app-name/static/中的文件) , 後面你會學習到它們分別用來幹什麼.

 

定義視圖函數(訪問頁面時的內容)

咱們在learn這個目錄中,views.py打開,修改其中的源代碼,改爲下面的

***************************************************

#coding:utf-8

from django.http import HttpResponse

 

def index(request):

    return HttpResponse(u"歡迎光臨 自強學堂!")

*****************************************************

from django.shortcuts import render

from django.http import HttpResponse

 

def add(request):

    a = request.GET['a']

    b = request.GET['b']

    c = int(a)+int(b)

    return HttpResponse(str(c))

*********************************************************

第一行是聲明編碼爲utf-8, 由於咱們在代碼中用到了中文,若是不聲明就報錯.

第二行引入HttpResponse,它是用來向網頁返回內容的,就像Python中的 print 同樣,只不過 HttpResponse 是把內容顯示到網頁上。

咱們定義了一個index()函數,第一個參數必須是 request,與網頁發來的請求有關,request 變量裏面包含getpost的內容,用戶瀏覽器,系統等信息在裏面(後面會講,先了解一下就能夠)。

函數返回了一個 HttpResponse 對象,能夠通過一些處理,最終顯示幾個字到網頁上。

那問題來了,咱們訪問什麼網址才能看到剛纔寫的這個函數呢?怎麼讓網址和函數關聯起來呢?

 

定義視圖函數相關的URL(網址)  (即規定 訪問什麼網址對應什麼內容)

咱們打開 mysite/mysite/urls.py 這個文件, 修改其中的代碼:

Django 1.8.x及以上,Django 官方鼓勵(或說要求)先引入,再使用:

*****************************************************************

from django.conf.urls import url

from django.contrib import admin

from learn import views as learn_views  # new

 

urlpatterns = [

    url(r'^$', learn_views.index),  # new

    url(r'^admin/', admin.site.urls),

]

http://127.0.0.1:8000

*******************************************************************

from django.conf.urls import patterns, include, url

 

from django.contrib import admin

admin.autodiscover()

 

urlpatterns = patterns('',

    # Examples:

    url(r'^add/$', 'calc.views.add', name='add'), # 注意修改了這一行

    # url(r'^blog/', include('blog.urls')),

 

    url(r'^admin/', include(admin.site.urls)),

)

 

可經過如下方式來訪問,ab 在頁面上

http://127.0.0.1:8000/app2/?a=4&b=100

**********************************************************************

以上都修改並保存後,咱們來看一下效果!

views:

----------------------------------

#coding:utf-8

from django.shortcuts import render

from django.http import HttpResponse

 

# Create your views here.

def app2(request):

a = request.GET['a']

b = request.GET['b']

c = int(a)+int(b)

return HttpResponse(str(c))

 

def app3(request,a,b):

c = int(a)+int(b)

return HttpResponse(str(c))

 

urls:

----------------------------------

from django.conf.urls import url

from django.contrib import admin

from learn import views as learn_views

from app2 import views as app2_views

 

urlpatterns = [

    #http://127.0.0.1:8000/app3/4/6/ 可用此訪問

    url(r'^app3/(\d+)/(\d+)/$',app2_views.app3,name='app3'),

#http://127.0.0.1:8000/app2/?a=4&b=5 可用此訪問

url(r'^app2/$',app2_views.app2,name='app2'),

#http://127.0.0.1:8000 可用此訪問

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

    url(r'^admin/', admin.site.urls),

]

 

 

url(r'^app3/(\d+)/(\d+)/$',app2_views.app3,name='app3')

咱們在開發的時候,剛開始想用的是 /add2/4/5/ ,後來需求發生變化,好比咱們又想改爲 /4_add_5/這樣的格式,可是咱們在網頁中,代碼中不少地方都寫死的這樣就致使當咱們改了 urls.py 後,對應的模板,甚至還視圖中的跳轉,以及 models.py 中也可能有獲取網址的地方。每一個地方都要改,修改的代價很大,一不當心,有的地方沒改過來,那個就不能用了。能夠用reverse來進行轉換

#############################經部分後續處理#############################

 

Django 模板

-----------------------------------

判斷條件爲單{}:{% %}

變量輸出爲雙{}: {{變量}}

{% for i in List1 %}

{{i}}{% if not forloop.last %},{% endif %}

{% endfor %}

 

{% if not forloop.last %},{% endif %}

判斷是否到最後,不到最後輸出逗號,不然不輸出

 

for循環中還有不少有用的東西,以下:

變量 描述

forloop.counter 索引從 1 開始算

forloop.counter0 索引從 0 開始算

forloop.revcounter 索引從最大長度到 1

forloop.revcounter0 索引從最大長度到 0

forloop.first 當遍歷的元素爲第一項時爲真

forloop.last 當遍歷的元素爲最後一項時爲真

forloop.parentloop 用在嵌套的 for 循環中,獲取上一層 for 循環的 forloop

 

當列表中可能爲空值時用 for  empty

{% for athlete in athlete_list %}

    <li>{{ athlete.name }}</li>

{% empty %}

    <li>抱歉,列表爲空</li>

{% endfor %}

 

 

------------------------------------------

錯誤參考

Sql寫入數據庫變量須要加上引號

insert_sql = "insert into monitor_ping_report(data1,Line,Hostname,packet,pkloss,rtt)

VALUES('%s','%s','%s','%s','%s','%s')" % (date1,line,hostname,packet,pkloss,rtt)

 

sqlite3錯誤

若是錯誤的最後一行是

django.core.exceptions.ImproperlyConfigured: Error loading either pysqlite2 or sqlite3 modules (tried in that order): No module named _sqlite3

方法一:

則能夠試一下命令

wget http://pysqlite.googlecode.com/files/pysqlite-2.6.3.tar.gz

tar -xzf pysqlite-2.6.3.tar.gz

cd pysqlite

python setup.py build_static install

 

方法二:

官網有解釋說,python是自帶sqlite3的,因此不該該出現這個問題。查找資料後,發現我使用的Python2.7所使用的庫中沒有_sqlite3.so這個靜態文件,因此從別處將這個文件複製過來就ok了。

可安裝如下:

yum install pyhon-sqlite

yum install sqlite-devel

完成後可在Python中直接導入測試,如測試不成功,多是安裝在默認的版本中了,直接CP一個So文件就能夠了。

默認的文件在: /usr/lib64/python2.6/lib-dynload/_sqlite3.so

CP到正常版本的目錄下:/usr/local/lib/python2.7/lib-dynload/

 

CSRF驗證失敗. 相應中斷.

不使用 CSRF 驗證

setting.py 文件中,將此標註掉:  

#'django.middleware.csrf.CsrfViewMiddleware',

 

 

使用 CSRF 驗證

Html的表單Form後面加:{% csrf_token %}

同時在Views裏:

from django.template import RequestContext

return render_to_response('search.html',{'f':f},context_instance=RequestContext(req))---加在最後

Pip安裝出現Unicode錯誤

UnicodeDecodeError: 'ascii' codec can't decode byte 0xb1 in position 34: ordinal  not in range(128)

緣由是pip安裝python包會加載個人用戶目錄,個人用戶目錄剛好是中文的,ascii不能編碼。解決辦法是: 
python目錄 Python27\Lib\site-packages 建一個文件sitecustomize.py 
內容寫: 
import sys 
sys.setdefaultencoding('gb2312') 
python會自動運行這個文件。

 

 

升級Python出錯

上面是在Python編譯安裝順利的狀況下的大致流程,可是我在編譯的時候,Python出現了下面的提示信息:

http://www.tuicool.com/articles/FjmA3u

 

Python build finished, but the necessary bits to build these modules were not found:

   _bsddb             _sqlite3           _ssl

   _tkinter           bsddb185           bz2

   dbm                gdbm               readline

   sunaudiodev

To find the necessary bits, look in setup.py in detect_modules() for the module's name.

 

Yum install readline-devel sqlite-devel bzip2-devel.i686 openssl-devel.i686 gdbm-devel.i686 libdbi-devel.i686 ncurses-lib zlib-devel.i686

靜態文件設定

------------------------------------------------------

Manager同級目錄下建立static的文件夾

setting後加,告訴Django到哪找靜態文件------這樣就不用寫一個死的地址了

STATICFILES_DIRS = (

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

)

1. admin中文顯示:

----------------------------------------------------------------------------------------------

經確認是新版本的django包版本中只有zh_Hans目錄,沒有zh_CN,zh_Hans目錄複製一個zh_CNOk

一樓評論的方法也不錯,在settings裏面直接改爲zh-Hans,這樣就不用升級完Django,還去改目錄了。

-----------------------------------------------------------------------------------------------

2. 添加/更改 Model的字段

正常狀況下添加字段會出現錯誤,可將以前的字段設置容許爲空 null=True

而後再經過 python manage.py makemigrations/python manage.py migrate  更新數據庫。

Blank=True 可在Admin後臺中容許爲空,無需同步數據庫

Unique=True 設置數據庫惟一值

 

表結構的修改

表結構修改後,原來表中已存在的數據,就會出現結構混亂,makemigrations更新表的時候就會出錯

解決方法:

1、新增長的字段,設置容許爲空。生成表的時候,以前數據新增長的字段就會爲空。

(null=True容許數據庫中爲空,blank=True容許admin後臺中爲空)

2、新增長的字段,設置一個默認值。生成表的時候,以前的數據新增長字段就會應用這個默認值

 

3. 時間字段顯示

models中的時間字段,可在時間Field中設定auto_now_add=True, auto_now=True,這樣系統輸入時頁面上不顯示,自動更新,默認爲False頁面顯示,可手動更改

格式(默認均爲False,頁面上顯示,手工選擇

class DateField([auto_now=False, auto_now_add=False, **options])

class DateTimeField([auto_now=False, auto_now_add=False, **options])

 

pub_date = models.DateTimeField(u'建立時間',auto_now_add=True)------auto_now_add 爲建立時間,不會變化

update_time = models.DateTimeField(u'修改時間',auto_now=True)------auto_now 爲當前時間,可變化

4. admin:

--------------------------------------------------------------------

Admin放後臺管理配置,全部的Model若是要在DjangoAdmin中顯示,必須註冊

from .models import Mpls_Ping,Mpls_Form

admin.site.register(Mpls_Ping,Ping_Admin)

若是想在後臺顯示相關的字段,可建類以下,參數用admin.ModelAdmin

class Ping_Admin(admin.ModelAdmin):

    list_display =['POP','PE','A_end','B_end']------admim後臺可顯示的列    

5. Model若是在面中顯示字段自己內容,需在model類中添加__str__方法

    def __str__(self):

        return self.POP

6. From直接調用Model,可在Model中用如下方式:    

from django.db import models

from django import forms

from django.contrib import admin

from django.forms import ModelForm

 

# Create your models here.

class Mpls_Ping(models.Model):

    POP = models.CharField(max_length=50)

    PE = models.CharField(max_length=50)

    A_end = models.CharField(max_length=50)

    B_end = models.CharField(max_length=50)

    

    def __str__(self):

        return self.POP

    

class Mpls_Form(ModelForm):

    class Meta:

        model = Mpls_Ping------這裏左邊是model,右邊是上面建的庫名,不能有括號

        fields = ['POP','PE','A_end','B_end']------這裏是表單中顯示的列

7. 下拉框是一個二元數組

選擇下拉框:

user_type = (

                 (1,'user'),

                 (2,'admin'),

                 )

user_t = models.IntegerField(choices=user_type,default=1,null=True)

9. 啓用Mysql數據庫:

setting 中的 DATABASES改爲以下

DATABASES = {

    'default': {

        'ENGINE': 'django.db.backends.mysql', # Add 'postgresql_psycopg2', 'postgresql', 'mysql', 'sqlite3' or 'oracle'.

        'NAME': 'dbname',  (注意這個後綴名必定要寫對)                    # Or path to database file if using sqlite3.

        'USER': 'root',                      # Not used with sqlite3.

        'PASSWORD': '',                  # Not used with sqlite3.

        'HOST': '',                      # Set to empty string for localhost. Not used with sqlite3.

        'PORT': '',                      # Set to empty string for default. Not used with sqlite3.

    }

}

而後在主目錄同名下的__init__編輯以下:

import pymysql

pymysql.install_mydqldb()

10. 模糊查詢

Models放數據模型,建類,參數models.Model

若是是用Form方式加載Model庫,Form類參數爲forms.ModelForm

models.UserInfo.objects.all()

models.UserInfo.objects.all().values('user')    #只取user

models.UserInfo.objects.all().values_list('id','user')    #取出iduser列,並生成一個列表

models.UserInfo.objects.get(id=1)

models.UserInfo.objects.get(user='yangmv')

可經過1a=models.objects.all()獲得全部表數據,再經過

a.values() 顯示全部內容,以字典方式

a.values('') 顯露全部列的內容

a.values_list() 顯示全部內容,以元組方式

a.values_list(列,列) 顯示全部列

 

可經過如下方式

a.objects.filter(user__contains='lo')

filter(name="abc") # 等於filter(name__exact="abc") 名稱嚴格等於 "abc" 的人

filter(name__iexact="abc") # 名稱爲 abc 可是不區分大小寫,能夠找到 ABC, Abc, aBC,這些都符合條件

filter(name__contains="abc") # 名稱中包含 "abc"的人

filter(name__icontains="abc") #名稱中包含 "abc",且abc不區分大小寫

filter(name__regex="^abc") # 正則表達式查詢

filter(name__iregex="^abc")# 正則表達式不區分大小寫

 

exclude(name__contains="WZ") # 排除包含 WZ Person對象

filter(name__contains="abc").exclude(age=23) # 找出名稱含有abc, 可是排除年齡是23歲的

 

objects.all() 獲得是一個django.db.models.query.QuerySet ,可迭代,可用Value列出全部值

objects.filter() 獲得是一個django.db.models.query.QuerySet ,可迭代,可用Value列出全部值

也可經過a[0].字段名

a = m.objects.get()

獲得是一個django.db.models.query.QuerySet,不可迭代,可經過a.字段方式獲取值

11. 可在Models中直接用ForginKey連接到User的用戶庫

author = models.ForeignKey(User)

12. 在顯示頁面上連接到實際的頁面

在原Html頁面上:

<h1><a href="{% url 'blog.views.post_detail' pk=post.pk %}">{{ post.title }}</a></h1>---這裏用變量的方式來表示,格式爲:views函數 參數1 參數2

而後在urls:

這裏採用正則表達式來接收:?P<name>...  來接收來自name的變量

url(r'^post/(?P<pk>[0-9]+)/$', views.post_detail)

在建一個post_detail方法:

from django.shortcuts import render, get_object_or_404

def post_detail(request, pk):

    post = get_object_or_404(Post, pk=pk)------這裏的PostModel的庫名

return render(request, 'blog/post_detail.html', {'post': post})

 

最後建一個顯示的頁面:

{% extends 'blog/base.html' %}

 

{% block content %}

    <div class="date">

        {% if post.published_date %}

            {{ post.published_date }}

        {% endif %}

    </div>

    <h1>{{ post.title }}</h1>

    <p>{{ post.text|linebreaks }}</p>

    <p>{{ post.mymail }}</p>

{% endblock %}

 

15. django ModelForm has no model class specified.

Model建立From,總是跳出django ModelForm has no model class specified.

最後將如下form改成model就行了,搞了兩天了

原配置:

class PostForm(forms.ModelForm):

    class Meta:

        form = Post

        fields = ['title','text']

 

正確配置:

class PostForm(forms.ModelForm):

    class Meta:

        model = Post

        fields = ['title','text']

models類型參考:

字段類型

1models.AutoField  自增列= int(11)

  若是沒有的話,默認會生成一個名稱爲 id 的列,若是要顯示的自定義一個自增列,必須將給列設置爲主鍵 primary_key=True

2models.CharField  字符串字段

  必須 max_length 參數

3models.BooleanField  布爾類型=tinyint(1)

  不能爲空,Blank=True

4models.ComaSeparatedIntegerField  用逗號分割的數字=varchar

  繼承CharField,因此必須 max_lenght 參數

5models.DateField  日期類型 date

  對於參數,auto_now =True則每次更新都會更新這個時間;auto_now_add 則只是第一次建立添加,以後的更新再也不改變。

6models.DateTimeField  日期類型 datetime

  同DateField的參數

7models.Decimal  十進制小數類型= decimal

  必須指定整數位max_digits和小數位decimal_places

8models.EmailField  字符串類型(正則表達式郵箱)=varchar

  對字符串進行正則表達式

9models.FloatField  浮點類型= double

10models.IntegerField  整形

11models.BigIntegerField  長整形

  integer_field_ranges ={

    'SmallIntegerField':(-32768,32767),

    'IntegerField':(-2147483648,2147483647),

    'BigIntegerField':(-9223372036854775808,9223372036854775807),

    'PositiveSmallIntegerField':(0,32767),

    'PositiveIntegerField':(0,2147483647),

  }

12models.IPAddressField  字符串類型(ip4正則表達式)

13models.GenericIPAddressField  字符串類型(ip4ip6是可選的)

  參數protocol能夠是:bothipv4ipv6

  驗證時,會根據設置報錯

14models.NullBooleanField  容許爲空的布爾類型

15models.PositiveIntegerFiel  正Integer

16models.PositiveSmallIntegerField  正smallInteger

17models.SlugField  減號、下劃線、字母、數字

18models.SmallIntegerField  數字

  數據庫中的字段有:tinyintsmallintintbigint

19models.TextField  字符串=longtext

20models.TimeField  時間 HH:MM[:ss[.uuuuuu]]

21models.URLField  字符串,地址正則表達式

22models.BinaryField  二進制

23models.ImageField圖片

24models.FilePathField文件

 

更多參數

1null=True

  數據庫中字段是否能夠爲空

2blank=True

  djangoAdmin中添加數據時是否可容許空值

3primary_key =False

  主鍵,對AutoField設置主鍵後,就會代替原來的自增 id

4auto_now auto_now_add

  auto_now 自動建立---不管添加或修改,都是當前操做的時間

  auto_now_add 自動建立---永遠是建立時的時間

5choices

GENDER_CHOICE =(

(u'M', u'Male'),

(u'F', u'Female'),

)

gender = models.CharField(max_length=2,choices = GENDER_CHOICE)

6max_length

7default  默認值

8verbose_name  Admin中字段的顯示名稱

9name|db_column  數據庫中的字段名稱

10unique=True  不容許重複

11db_index =True  數據庫索引

12editable=True  在Admin裏是否可編輯

13error_messages=None  錯誤提示

14auto_created=False  自動建立

15help_text  在Admin中提示幫助信息

16validators=[]

17upload-to

數據庫寫入:

因爲Blog.objects.create()每保存一條就執行一次SQL,而bulk_create()是執行一條SQL存入多條數據,作會快不少!固然用列表解析代替 for 循環會更快!!

 

 vrflist = [Vrf_model(customer=’aaa’) for i in range(1,10)]

Vrf_model.objects.bulk_create(vrflist)

 

=========================================================================================

 

項目一

1.建立一個模型,用於輸入數據,在Admin裏註冊

2.Views裏定義兩個函數,一個用於顯示全部數據,一個用於查詢

3.CSEF錯誤:Form表單里加{% csrf_token %} ,在Views Return最後加context_instance=RequestContext(req)

4.經過FilterAll獲得的數據,可用Values_list方法獲得列表,再進行迭代出來

urls:

--------------------------------------------------------

from django.conf.urls import url

from django.contrib import admin

from app002 import views

 

urlpatterns = [

    url(r'^search/', views.search),           

    url(r'^index/', views.getIP),

    url(r'^admin/', admin.site.urls),

]

 

 

views:

--------------------------------------------------------

from django.shortcuts import render,render_to_response

from .models import MPLS_IP

from django.template import RequestContext

 

def getIP(req):

    ipinfo = MPLS_IP.objects.all().values_list()

    return render_to_response('index.html', {'ipinfo':ipinfo})

    

def search(req):

    if req.method == 'POST':

        pe1 = req.POST['pe']

        f1 = MPLS_IP.objects.filter(PE=pe1)------這裏有點重複

        f= f1.values_list()

        直接這裏就能夠了:

        f = MPLS_IP.objects.filter(PE=pe1).values()--------這是以字典方式顯示,values_list以元組方式顯示

    else:

        f = ''

    return render_to_response('search.html',{'f':f},context_instance=RequestContext(req))

  

 

models:

--------------------------------------------------------

from django.db import models

 

# Create your models here.

class MPLS_IP(models.Model):

    POP = models.CharField(u'站點',max_length=30)

    PE = models.CharField(u'接入PE',max_length=30)

    A_end = models.CharField(max_length=30)

    B_end = models.CharField(max_length=30)

    pub_date = models.DateTimeField(u'建立時間',auto_now_add=True)

    update_time = models.DateTimeField(u'修改時間',auto_now=True)

   

    def __str__(self):

        return self.POP

 

index.html:

--------------------------------------------------------

<html>

<title>my page test</title>

<body>

<div>

<table >

<tr>

<td>ID</td>

<td>POP</td>

<td>PE</td>

<td>A-end</td>

<td>B-end</td>

<td>建立時間</td>

<td>修改時間</td>

</tr>

{% for i in ipinfo %}

<tr>

{% for j in i %}

<td>{{j}}</td>

{% endfor %}

</tr>

{% endfor %}

</table>

</div>

</body>

</html>

 

 

 

search.html:

--------------------------------------------------------

<html>

<title>my page test</title>

<body>

<form  action='/search/' method="post">

{% csrf_token %}

<input type='text' name='pe'>

<input type='submit' value='查詢'>

</form>

<div>

<table >

<tr>

<td>ID</td>

<td>POP</td>

<td>PE</td>

<td>A-end</td>

<td>B-end</td>

<td>建立時間</td>

<td>修改時間</td>

</tr>

{% for i in f %}

<tr>

{% for j in i %}------這裏兩次For,用字典可能更好

<td>{{j}}</td>

{% endfor %}

</tr>

{% endfor %}

</table>

</div>

 

 

=====================================================================================

Django 模板標籤

if/else 標籤

基本語法格式以下:

{% if condition %}

     ... display

{% endif %}

或者:

{% if condition1 %}

   ... display 1

{% elif condiiton2 %}

   ... display 2

{% else %}

   ... display 3

{% endif %}

根據條件判斷是否輸出。if/else 支持嵌套。

{% if %} 標籤接受 and or 或者 not 關鍵字來對多個變量作判斷 ,或者對變量取反( not ),例如:

{% if athlete_list and coach_list %}

     athletes coaches 變量都是可用的。

{% endif %}

 

for 標籤

{% for %} 容許咱們在一個序列上迭代。

Pythonfor 語句的情形相似,循環語法是 for X in Y Y是要迭代的序列而X是在每個特定的循環中使用的變量名稱。

每一次循環中,模板系統會渲染在 {% for %} {% endfor %} 之間的全部內容。

例如,給定一個運動員列表 athlete_list 變量,咱們可使用下面的代碼來顯示這個列表:

<ul>

{% for athlete in athlete_list %}

    <li>{{ athlete.name }}</li>

{% endfor %}

</ul>

 

給標籤增長一個 reversed 使得該列表被反向迭代:

{% for athlete in athlete_list reversed %}

...

{% endfor %}

 

能夠嵌套使用 {% for %} 標籤:

{% for athlete in athlete_list %}

    <h1>{{ athlete.name }}</h1>

    <ul>

    {% for sport in athlete.sports_played %}

        <li>{{ sport }}</li>

    {% endfor %}

    </ul>

{% endfor %}

 

ifequal/ifnotequal 標籤

{% ifequal %} 標籤比較兩個值,當他們相等時,顯示在 {% ifequal %} {% endifequal %} 之中全部的值。

下面的例子比較兩個模板變量 user currentuser :

{% ifequal user currentuser %}

    <h1>Welcome!</h1>

{% endifequal %}

 

{% if %} 相似, {% ifequal %} 支持可選的 {% else%} 標籤:8

{% ifequal section 'sitenews' %}

    <h1>Site News</h1>

{% else %}

    <h1>No News Here</h1>

{% endifequal %}

 

註釋標籤

-------------------------------------------------------------------------

Django 註釋使用 {# #}

{# 這是一個註釋 #}

 

過濾器

模板過濾器能夠在變量被顯示前修改它,過濾器使用管道字符,以下所示:

{{ name|lower }}

{{ name }} 變量被過濾器 lower 處理後,文檔大寫轉換文本爲小寫。

過濾管道能夠被* 套接* ,既是說,一個過濾器管道的輸出又能夠做爲下一個管道的輸入:

{{ my_list|first|upper }}

以上實例將第一個元素並將其轉化爲大寫。

有些過濾器有參數。 過濾器的參數跟隨冒號以後而且老是以雙引號包含。 例如:

{{ bio|truncatewords:"30" }}

這個將顯示變量 bio 的前30個詞。

其餘過濾器:

addslashes : 添加反斜槓到任何反斜槓、單引號或者雙引號前面。

date : 按指定的格式字符串參數格式化 date 或者 datetime 對象,實例:

{{ pub_date|date:"F j, Y" }}

length : 返回變量的長度。

include 標籤

{% include %} 標籤容許在模板中包含其它的模板的內容。

下面這兩個例子都包含了 nav.html 模板:

{% include "nav.html" %}

 

模板繼承

模板能夠用繼承的方式來實現複用。

接下來咱們先建立以前項目的 templates 目錄中添加 base.html 文件,代碼以下:

<html>

  <head>

    <title>Hello World!</title>

  </head>

 

  <body>

    <h1>Hello World!</h1>

    {% block mainbody %}

       <p>original</p>

    {% endblock %}

  </body>

</html>

以上代碼中,名爲mainbodyblock標籤是能夠被繼承者們替換掉的部分。

全部的 {% block %} 標籤告訴模板引擎,子模板能夠重載這些部分。

hello.html中繼承base.html,並替換特定blockhello.html修改後的代碼以下:

{% extends "base.html" %}

 

{% block mainbody %}

<p>繼承了 base.html 文件</p>

{% endblock %}

第一行代碼說明hello.html繼承了 base.html 文件。能夠看到,這裏相同名字的block標籤用以替換base.html的相應block

 

前端調整

 

靜態文件加載:

Manager同級目錄下建立static的文件夾

setting後加,告訴Django到哪找靜態文件------這樣就不用寫一個死的地址了

STATICFILES_DIRS = (

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

)

Index頁面上加載:{% load staticfiles %}  

同時須更改全部CSS連接:

<link href="/static/css/bootstrap.css" rel="stylesheet">

<link href="/static/css/bootstrap-responsive.css" rel="stylesheet">

<script src="/static/js/bootstrap.js"></script>

------------------------------------------------------

.pull-left or .pull-right    左右調整

table:

class='table '顯示錶格

class='table table-striped' 行顏色不一樣

<table class="table table-hover"> 移到顯示不一樣顏色

<table class="table table-bordered">  顯示錶格

<caption>個人標題</caption> 顯示錶格標題

tr:

<tr class="success">

success 綠色

error 紅色

warning 橙色

info 蘭色

<span class="glyphicon glyphicon-plus"></span>    + 圖標

<a href="{% url 'blog.views.post_new' %}" > 可經過變量的方式連接到後臺

前端想經過標題連接到詳細頁面:

<h1><a href="{% url 'blog.views.post_detail' pk=post.pk %}">{{ post.title }}</a></h1>

 

後端URL接收:

 url(r'^post/(?P<pk>[0-9]+)/$', views.post_detail),

views接收

from django.shortcuts import render, get_object_or_404

def post_detail(request, pk):

    post = get_object_or_404(Post, pk=pk)---------------這是主要的

    return render(request, 'blog/post_detail.html', {'post': post})

前端Detial模塊

{% extends 'blog/base.html' %}

 

{% block content %}

    <div class="date">

        {% if post.published_date %}

            {{ post.published_date }}

        {% endif %}

    </div>

    <h1>{{ post.title }}</h1>

    <p>{{ post.text|linebreaks }}</p>

{% endblock %}

 

 

 

VIEWS

這裏獲得的是Model中定義顯示的__str__名字

get_object_or_404(Ipinfo_model,pk=pk)

Ipinfo_model  Model中定義的庫名

Pk 是前端頁面是返回的變量

 

這樣就不須要抓取前面的ID,再經過ID來二次過濾

 

 

Reverse for 'add' with arguments '()' and keyword arguments '{}' not found. 0 pattern(s)

Templates中寫URL時,常常出現這個錯誤

<a href="{% url 'add' %}" class="top-menu">asdfasdfa</a>

url(r'^add/', views.add),

原本的url配置通常情況下是沒有問題的,可是{% url %}這個命令要reverse url的配置,即經過 cal.views.month這個view找到對應的url,這時候django就會發現,找到了3個有month這個viewurl的配置, 他不知道哪一個市對的,因此默認是最後一個配置即(r"^month$", "month"),這時候,你能夠看到這個配置的url是沒有參數的,因此django纔會報錯說個人arguments'(2013, 1)' , 可是url上沒有參數的。

糾正的方法就是使用命名url,即給每一個配置的url起個惟一的名字,以下:

<a href="{% url 'add' %}" class="top-menu">asdfasdfa</a>

url(r'^add/', views.add,name='add'),

 

 

 

 

 

 

Django Book 2.0學習

MVC設計模式

models

views

urls

templates

 

第三章:視圖和URL配置

 

(r'^mysite/',include('mysite.urls'))可用此方式直接將URL引到mysite APP

 

from django.conf.urls import url

from django.contrib import admin

 

動態視圖:

內容動態,但URL是靜態的

 

動態URL

設計是這樣的:

/time/plus/1/ 顯示當前時間+1個小時的頁面

/time/plus/2/ 顯示當前時間+2個小時的頁面

/time/plus/3/ 顯示當前時間+3個小時的頁面,

以此類推。

 

正常多是這樣寫的:

('^time/plus/2/$', two_hours_ahead),

    ('^time/plus/3/$', three_hours_ahead),

    ('^time/plus/4/$', four_hours_ahead),

    

咱們可用以正則來實現:

(r'^time/plus/(\d{1,2})/$', hours_ahead),

這個URL模式將匹配相似 /time/plus/2/ , /time/plus/25/ ,甚至 /time/plus/XX/ 的任何URL

hours_ahead

--------------------------------------------------------

from django.http import Http404, HttpResponse

import datetime

def hours_ahead(request, offset):------這裏Offset就是前面正則的變量值

    try:

        offset = int(offset)---這裏如何不是數字,將引起異常

    except ValueError:

        raise Http404()

    dt = datetime.datetime.now() + datetime.timedelta(hours=offset)

    html = "<html><body>In %s hour(s), it will be %s.</body></html>" % (offset, dt)

    return HttpResponse(html)

    

動態URL的理解:

URL後中正則來表示動態的值,同時在Views裏新建的函數將值放到參數裏。

    datetime.datetime.now()   顯示當前時間

     datetime.timedelta(hours=offset) 設定當時小時,默認爲最後計時924776

     datetime.datetime.now() + datetime.timedelta(3)

datetime.datetime(2016, 8, 20, 12, 9, 9, 924776)

 

第四章:模板

if / else ---可添加 and / or / not 等判斷方式

for / endfor

forloop.last

forloop.first

ifequal比較兩個值,不能用於字典,列表,布爾。

ifnotequal

多行註釋:{% comment %}  {% endcomment %}

 

過濾器,一般使用管道字符 | , 可套接

{{ my_list|first|upper }}-------取出第一個字符並大寫

 

有些過濾器有參數。 過濾器的參數跟隨冒號以後而且老是以雙引號包含。 例如:

{{ bio|truncatewords:"30" }}----------顯示變量 bio 的前30個詞。

 

addslashes : 添加反斜槓到任何反斜槓、單引號或者雙引號前面。 這在處理包含JavaScript的文本時是很是

有用的。

date : 按指定的格式字符串參數格式化 date 或者 datetime 對象, 範例:{{ pub_date|date:"F j, Y" }}

    length : 返回變量的長度。 對於列表,這個參數將返回列表元素的個數。 對於字符串,這個參數將返回字

符串中字符的個數。 你能夠對列表或者字符串,或者任何知道怎麼測定長度的Python 對象使用這個方法

(也就是說,有 __len__() 方法的對象)。

 

 

在視圖中使用模板

TEMPLATE_DIRS = (

     '/home/django/mysite/templates', )

    

使用get_template自動加載一個模板文件,而後更改後輸出。get_template直接引用Setting中的TEMPLATE_DIRS

from django.template.loader import get_template

    t = get_template('current_datetime.html')

    html = t.render(Context({'current_date': now}))

    return HttpResponse(html)

直接使用render_to_response返回一個模板

     return render_to_response('current_datetime.html', {'current_date': now})

    

    locals()包含全部的變量,可在函數有多個變量時使用,方便省事

     return render_to_response('current_datetime.html', locals())

    

    get_template()中使用子目錄

把全部的模板都存放在一個目錄下可能會讓事情變得難以掌控。 你可能會考慮把模板存放在你模板目錄的子目錄中

t = get_template('dateapp/current_datetime.html')---------只要加上主目錄便可

    

     {% include %}模板標籤--該標籤容許在(模板中)包含其它的模板的內容

     

     

模板繼承

{% extends "base.html" %}

 

若是你須要訪問父模板中的塊的內容,使用 {{ block.super }}這個標籤吧,這一個魔法變量將會表現出

父模板中的內容。 若是隻想在上級代碼塊基礎上添加內容,而不是所有重載,該變量就顯得很是有用了

 

    

第五章:模型

數據查詢

model.objects.all()   <===> select * form table

 

數據過濾 filter--可有多個參數

過濾魔法:

字段__contaions 至關於LIKE

字段__contaions 加i不區分大小寫

 

 get() 獲取單個對象,若是有多個對象或無對象 則出現異常

 多個:MultipleObjectsReturned:

 無:DoesNotExist: 是一個屬性,可用Try方式獲取異常

 

數據排序:

Publisher.objects.order_by("state_province", "address")---多個排序

可直接在Model中直接引用Meta

class Meta:

         ordering = ['name']

        

鏈式查詢(連鎖查詢)

Publisher.objects.filter(country="U.S.A.").order_by("name") 查詢後排序

Publisher.objects.order_by('name')[0] 顯示第一個出版本商名稱,切片方式[:3]顯示前3個,不支持負索引

 

更新幾列update

找出ID52的而後更新Name

 Publisher.objects.filter(id=52).update(name='Apress Publishing')

 

 可同時更新多條記錄

 Publisher.objects.all().update(country='USA')

 

刪除對象delete

Publisher.objects.filter(country='USA').delete()

Publisher.objects.all().delete()----刪除全部記錄

 

 

 

 

第六章:Django站點管理

 

django.contrib

如用戶鑑別系統(django.contrib.auth)

支持匿名會話(django.contrib.sessioins)

用戶評註系統(django.contrib.comments)

 

Admin是如何工做的

blank=True 可設置字段容許爲空,即時生效,字段再也不是粗體了

 

設置日期型和數字型字段可選 ,日期型、時間型和數字型字段不接受空字符串

若是你想容許一個日期型(DateFieldTimeFieldDateTimeField)或數字型

IntegerFieldDecimalFieldFloatField)字段爲空,你須要使用null=True * * blank=True

null=True 須要更新數據庫。

 

自定義字段標籤

可直接在Model定義時加上標題:

name = models.CharField(u'出版商名稱',max_length=30)

 

自定義ModelAdmi

搜索框: search_fields = ('first_name', 'last_name')

顯示框: list_display = ('first_name', 'last_name', 'email')

右邊過濾:list_filter = ('publication_date',) 在頁面右邊顯示

另一種過濾日期的方式是使用date_hierarchy選項

date_hierarchy = 'publication_date'

值是一個字串,在頁面上面返回一個條欄,顯示日期彙總的內容

排序: ordering = ('-publication_date',)

 

 

自定義編輯表單

class BookAdmin(admin.ModelAdmin):

    list_display = ('title', 'publisher', 'publication_date')

    list_filter = ('publication_date',)

    date_hierarchy = 'publication_date'

    ordering = ('publication_date',)

    

    

自定義表單,可顯示或隱藏相關字段

    **fields = ('title', 'authors', 'publisher', 'publication_date')

 

對多選字段,可用filter_horizontal來顯示一個多選擇框,手工選擇

filter_horizontal = ('authors',) 水平

filter_vertical = ('authors',) 垂直

單選下拉框再也不顯示,而顯示一個放大鏡樣的,點擊那個圖標將會彈出一個窗口,在那裏你能夠選擇想要添加的

raw_id_fields = ('publisher',)

 

 

全部的顯示均爲元組,只有date_hierarchy中字串

 

 

 

 

第七章:表單Form

URL相關信息---若是返回同一個相關的URLaction=''

屬性/方法 說明 舉例

request.path 除域名之外的請求路徑,以正斜槓開頭 "/hello/"

request.get_host() 主機名(好比,一般所說的域名) "127.0.0.1:8000" or

"www.example.com"

request.get_full_path() 請求路徑,可能包含查詢字符串 "/hello/?print=true"

request.is_secure() 若是經過HTTPS訪問,則此方法返回True, 不然返回False True 或者 False

 

request.META 是一個Python字典,包含了全部本次HTTP請求的Header信息,好比用戶IP地址和用戶Agent(一般是瀏覽器的名稱和版本號)。 注意,Header信息的完整列表取決於用戶所發送的Header信息和服務器

端設置的Header信息。 這個字典中幾個常見的鍵值有:

HTTP_REFERER,進站前連接網頁,若是有的話。 (請注意,它是REFERRER的筆誤。)

HTTP_USER_AGENT,用戶瀏覽器的user-agent字符串,若是有的話。 例如:"Mozilla/5.0 (X11; U; Linux i686; frFR; rv:1.8.1.17) Gecko/20080829 Firefox/2.0.0.17" .

REMOTE_ADDR 客戶端IP,如:"12.345.67.89" (若是申請是通過代理服務器的話,那麼它多是以逗號分割的多個IP地址,如:"12.345.67.89,23.456.78.90" )

 

 

request.GETrequest.POST是類字典對象

request.GETrequest.POST都有get()keys()values()方法

POST數據是來自HTML中的〈form〉標籤提交的,而GET數據可能來自〈form〉提交也多是URL中的查詢字符串(the query string)

 

這裏:books|length 返回書的數量

 books|pluralize 有多本書,在前面book後加s

 

{% if books %}

    <p>Found {{ books|length }} book{{ books|pluralize }}.</p>

    <ul>

        {% for book in books %}

        <li>{{ book.title }}</li>

        {% endfor %}

    </ul>

{% else %}

    <p>No books matched your search criteria.</p>

{% endif %}

 

簡單的驗證

若是輸入爲空,提示,若是超過20字符,提示

 

 

編寫Contact表單

 

django.core.mail.send_mail函數來發送e-mail

這個函數有四個必選參數: 主題,正文,寄信人和收件人列表。

send_mailDjangoEmailMessage類的一個方便的包裝,EmailMessage類提供了更高級的方法,好比附件,多部分郵件,以及對於郵件頭部的完整控制。

 

咱們應每次都給成功的POST請求作重定向。 這就是web開發的最佳實踐。

HttpResponseRedirect

 

思路:咱們每次判斷用戶輸入,若是沒有輸入返回從新輸入,那些已輸入的則返回輸入的值

可用字典的方式返回:request.GET.get('subject')

 

 

 

第一個Form

每個邦定Form實體都有一個errors屬性,它爲你提供了一個字段與錯誤消息相映射的字典表。

 f['subject'].errors

 

 form.as_table Form產生一個表格

 

 Html中的Text域在Form中可經過widget=forms.Textarea顯示

 message = forms.CharField(widget=forms.Textarea)

 

 限制最大()長度

  subject = forms.CharField(max_length=100min_length=100 )

 

 設置初始值

 可在實例化對象時設定

 form = ContactForm(initial={'subject': 'I love your site!'})

 

 自定義校驗規則

  自定義長度,自定義提示消息,在類下建立一個方法

  Djangoform系統自動尋找匹配的函數方法,該方法名稱以clean_開頭,並以字段名稱結束。

  若是有這樣的方法,它將在校驗時被調用。

  def clean_message(self):

        message = self.cleaned_data['message']

        num_words = len(message.split())

        if num_words < 10:

            raise forms.ValidationError("Not enough words,must be more then 4 words!")

        return message

        

 指定標籤

  Lable,不能像Model中直接寫字串方式。

  email = forms.EmailField(required=False, label='Your email address' )

 

定製Form設計

{{form.as_table}}`` 顯示錶單

 

  修改form的顯示的最快捷的方式是使用CSS。 尤爲是錯誤列表,能夠加強視覺效果。

  自動生成的錯誤列表精確的使用`` <ul class=errorlist>``,這樣,咱們就能夠針對它們使用CSS。 下面的CSS讓錯誤更加醒目了:

    每個字段部件(<input type=text>, <select>, <textarea>, 或者相似)均可以經過訪問{{form.字段名}}進行單獨的渲染。

 

 

 

 

第八章:高級視圖和URL配置

 

URLconf 技巧

能夠導入函數後用方法表示  (r'^time/$', views.current_datetime)

也能夠直接使用,但以字串的方式 (r'^time/$', 'mysite.views.current_datetime' ),

還能夠以下方式,可在頭部將函數所屬文件先列出來,後面直接寫方法便可

urlpatterns = patterns('mysite.views' ,

    (r'^hello/$', 'hello' ),

    (r'^time/$', 'current_datetime' )

可經過此方式對多個APP進行URL指定

    

使用命名組

關鍵字參數 對比 位置參數

可混合使用,但位置參數要有關鍵字參數前面

Python 正則表達式中,命名的正則表達式組的語法是 (?P<name>pattern) ,這裏 name 是組的名字,而pattern 是匹配的某個模式。

(r'^articles/(\d{4})/$', views.year_archive),

(r'^articles/(?P<year>\d{4})/$', views.year_archive),---命名組

可讀性強,不用更改視圖

 

理解匹配/分組算法

命名組和非命名組是不能同時存在於同一個URLconf的模式中的

1.若是有任何命名的組,Django會忽略非命名組而直接使用命名組。

2.不然,Django會把全部非命名組以位置參數的形式傳遞。

 

傳遞額外的參數到視圖函數中

URLconf裏面的每個模式均可以包含第三個數據: 一個關鍵字參數字典

(r'^foo/$', views.foobar_view, {'template_name': 'template1.html'}),

     (r'^bar/$', views.foobar_view, {'template_name': 'template2.html'}),

 

def foobar_view(request, template_name):

    m_list = MyModel.objects.filter(is_new=True)

    return render_to_response(template_name, {'m_list': m_list})

這樣可用一個視圖來返回兩個不一樣的頁面

 

僞造捕捉到的URLconf

可產生這樣的URL/mydata/jan/01/

(r'^mydata/(?P<month>\w{3})/(?P<day>\d\d)/$', views.my_view),

def my_view(request, month, day):

 

若是要這樣的 /mydata/birthday/ , 這個URL等價於 /mydata/jan/06/

(r'^mydata/birthday/$', views.my_view, {'month': 'jan', 'day': '06'}),

你根本不用改變你的視圖函數。 視圖函數只會關心它 得到 參數

 

建立一個通用視圖

  用字典來顯示不一樣的Model,傳遞給同一個視圖

(r'^events/$', views.object_list, {'model': models.Event}),

     (r'^blog/entries/$', views.object_list, {'model': models.BlogEntry}),

    

     def object_list(request, model):

    obj_list = model.objects.all()

    template_name = 'mysite/%s_list.html' % model.__name__.lower()

    return render_to_response(template_name, {'object_list': obj_list})

    

每一個Python的類都有一個 __name__ 屬性返回類名

 

提供視圖配置選項

用戶可能會但願配置上能有些自由度,用額外URLconf參數實現

瞭解捕捉值和額外參數之間的優先級 額外的選項

(r'^mydata/(?P<id>\d+)/$', views.my_view, {'id': 3}),

無論前端傳什麼值,2240URL均以3對待

 

 

使用缺省視圖參數

(r'^blog/page(?P<num>\d+)/$', views.page),

def page(request, num='1'):

    

特殊狀況下的視圖

('^([^/]+)/([^/]+)/add/$', views.add_stage),

匹配像 /myblog/entries/add/ /auth/groups/add/ 這樣的URL

 

/auth/user/add/ 是個特殊狀況

def add_stage(request, app_label, model_name):

    if app_label == 'auth' and model_name == 'user':

        # do specialcase code

    else:

        # do normal code

最好這樣寫,按順利執行,不要放在Views

('^auth/user/add/$', views.user_add_stage),

     ('^([^/]+)/([^/]+)/add/$', views.add_stage),

 

URL中捕獲文本

(r'^articles/(?P<year>\d{4})/$', views.year_archive),

在寫視圖要注意傳入參數要變整形

 

決定URLconf搜索的東西

URL只匹配/後面的內容,不包括GETPOST請求

 

視圖函數的高級概念

def some_page_get(request):

    assert request.method == 'GET'

    do_something_for_get()

    return render_to_response('page.html')

 

assert語句用來聲明某個條件是真的。

參數前1個星號,返回元組

參數前2個星號,返回字典

 

 

包裝視圖函數

用戶登陸後訪問每一個視圖都要驗證一次,

def my_view1(request):

    if not request.user.is_authenticated():

        return HttpResponseRedirect('/accounts/login/')

def my_view2(request):

    if not request.user.is_authenticated():

可用如下代碼替換:

def requires_login(view):

     def new_view(request, *args, **kwargs):

         if not request.user.is_authenticated():

             return HttpResponseRedirect('/accounts/login/')

         return view(request, *args, **kwargs)

     return new_view    

包含其餘URLconf    

(r'^weblog/', include('mysite.blog.urls')),

 

自填寫時間,能夠設定字段,不顯示在頁面中,用戶沒法修改

pub_date = models.DateTimeField(u'建立時間',auto_now_add=True)

update_time = models.DateTimeField(u'修改時間',auto_now=True)

 

 json愈來愈流行,經過python獲取到json格式的字符串後,能夠經過eval函數轉換成dict格式:

>>> a='{"name":"yct","age":10}'

>>> eval(a)
{'age': 10, 'name': 'yct'}

支持字符串和數字,其他格式的好像不支持:

>>> a='{"name":"yct","age":10,"tmp":dddd}'
>>> eval(a)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<string>", line 1, in <module>

NameError: name 'dddd' is not defined 

相關文章
相關標籤/搜索