錯誤參考 row 460html
models類型參考python
模板標籤 row 410mysql
字符串轉換爲字典web
可直接下載源碼進行安裝正則表達式
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_CN就Ok了
一樓評論的方法也不錯,在settings裏面直接改爲zh-Hans,這樣就不用升級完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 的開關,靜態文件的位置等。
-------------------------------------------------------------------------------------------------------------------------
django-admin.py startproject project-name
一個 project 爲一個項目,project-name 項目名稱,改爲你本身的,要符合Python 的變量命名規則(如下劃線或字母開頭)
python manage.py startapp app-name
或 django-admin.py startapp app-name
通常一個項目有多個app, 固然通用的app也能夠在多個項目中使用。
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 更新數據庫。
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
python manage.py flush
此命令會詢問是 yes 仍是 no, 選擇 yes 會把數據所有清空掉,只留下空表。
python manage.py createsuperuser
# 按照提示輸入用戶名和對應的密碼就行了郵箱能夠留空,用戶名和密碼必填
# 修改 用戶密碼能夠用:
python manage.py changepassword username
python manage.py dumpdata appname > appname.json
python manage.py loaddata appname.json
關於數據操做 詳見:數據導入數據遷移(http://www.ziqiangxuetang.com/django/django-data-migration.html),如今瞭解有這個用法就能夠了。
python manage.py shell
若是你安裝了 bpython 或 ipython 會自動用它們的界面,推薦安裝 bpython。
這個命令和 直接運行 python 或 bpython 進入 shell 的區別是:你能夠在這個 shell 裏面調用當前項目的 models.py 中的 API,對於操做數據,還有一些小測試很是方便。
python manage.py dbshell
Django 會自動進入在settings.py中設置的數據庫,若是是 MySQL 或 postgreSQL,會要求輸入數據庫用戶密碼。
在這個終端能夠執行數據庫的SQL語句。若是您對SQL比較熟悉,可能喜歡這種方式。
終端上輸入 python manage.py 能夠看到詳細的列表,在忘記子名稱的時候特別有用。
-------------------------------------------------------------
Django中網址是寫在 urls.py 文件中,用正則表達式對應 views.py 中的一個函數(或者generic類),咱們用一個項目來演示。
django-admin startproject mysite
運行後,若是成功的話, 咱們會看到以下的目錄樣式
mysite
├── manage.py
└── mysite
├── __init__.py
├── settings.py
├── urls.py
└── wsgi.py
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 變量裏面包含get或post的內容,用戶瀏覽器,系統等信息在裏面(後面會講,先了解一下就能夠)。
函數返回了一個 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)),
)
可經過如下方式來訪問,a和b 在頁面上
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來進行轉換
#############################經部分後續處理#############################
-----------------------------------
判斷條件爲單{}:{% %}
變量輸出爲雙{}: {{變量}}
{% 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 %}
------------------------------------------
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)
若是錯誤的最後一行是
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 驗證
在 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))---加在最後
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"),
)
----------------------------------------------------------------------------------------------
經確認是新版本的django包版本中只有zh_Hans目錄,沒有zh_CN,把zh_Hans目錄複製一個zh_CN就Ok了
一樓評論的方法也不錯,在settings裏面直接改爲zh-Hans,這樣就不用升級完Django,還去改目錄了。
-----------------------------------------------------------------------------------------------
正常狀況下添加字段會出現錯誤,可將以前的字段設置容許爲空 null=True
而後再經過 python manage.py makemigrations/python manage.py migrate 更新數據庫。
Blank=True 可在Admin後臺中容許爲空,無需同步數據庫
Unique=True 設置數據庫惟一值
表結構的修改
表結構修改後,原來表中已存在的數據,就會出現結構混亂,makemigrations更新表的時候就會出錯
解決方法:
1、新增長的字段,設置容許爲空。生成表的時候,以前數據新增長的字段就會爲空。
(null=True容許數據庫中爲空,blank=True容許admin後臺中爲空)
2、新增長的字段,設置一個默認值。生成表的時候,以前的數據新增長字段就會應用這個默認值
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 爲當前時間,可變化
--------------------------------------------------------------------
Admin放後臺管理配置,全部的Model若是要在Django的Admin中顯示,必須註冊
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後臺可顯示的列
def __str__(self):
return self.POP
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']------這裏是表單中顯示的列
選擇下拉框:
user_type = (
(1,'user'),
(2,'admin'),
)
user_t = models.IntegerField(choices=user_type,default=1,null=True)
將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()
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') #取出id和user列,並生成一個列表
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.字段方式獲取值
author = models.ForeignKey(User)
在原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)------這裏的Post是Model的庫名
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 %}
從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']
若是沒有的話,默認會生成一個名稱爲 id 的列,若是要顯示的自定義一個自增列,必須將給列設置爲主鍵 primary_key=True。
必須 max_length 參數
不能爲空,Blank=True
繼承CharField,因此必須 max_lenght 參數
對於參數,auto_now =True則每次更新都會更新這個時間;auto_now_add 則只是第一次建立添加,以後的更新再也不改變。
同DateField的參數
必須指定整數位max_digits和小數位decimal_places
對字符串進行正則表達式
integer_field_ranges ={
'SmallIntegerField':(-32768,32767),
'IntegerField':(-2147483648,2147483647),
'BigIntegerField':(-9223372036854775808,9223372036854775807),
'PositiveSmallIntegerField':(0,32767),
'PositiveIntegerField':(0,2147483647),
}
參數protocol能夠是:both、ipv4、ipv6
驗證時,會根據設置報錯
數據庫中的字段有:tinyint、smallint、int、bigint
1、null=True
數據庫中字段是否能夠爲空
2、blank=True
django的Admin中添加數據時是否可容許空值
3、primary_key =False
主鍵,對AutoField設置主鍵後,就會代替原來的自增 id 列
4、auto_now 和 auto_now_add
auto_now 自動建立---不管添加或修改,都是當前操做的時間
auto_now_add 自動建立---永遠是建立時的時間
5、choices
GENDER_CHOICE =(
(u'M', u'Male'),
(u'F', u'Female'),
)
gender = models.CharField(max_length=2,choices = GENDER_CHOICE)
6、max_length
7、default 默認值
8、verbose_name Admin中字段的顯示名稱
9、name|db_column 數據庫中的字段名稱
10、unique=True 不容許重複
11、db_index =True 數據庫索引
12、editable=True 在Admin裏是否可編輯
13、error_messages=None 錯誤提示
14、auto_created=False 自動建立
15、help_text 在Admin中提示幫助信息
16、validators=[]
17、upload-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.經過Filter或All獲得的數據,可用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>
=====================================================================================
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 %} 容許咱們在一個序列上迭代。
與Python的 for 語句的情形相似,循環語法是 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>
以上代碼中,名爲mainbody的block標籤是能夠被繼承者們替換掉的部分。
全部的 {% block %} 標籤告訴模板引擎,子模板能夠重載這些部分。
hello.html中繼承base.html,並替換特定block,hello.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 左右調整
class='table '顯示錶格
class='table table-striped' 行顏色不一樣
<table class="table table-hover"> 移到顯示不一樣顏色
<table class="table table-bordered"> 顯示錶格
<caption>個人標題</caption> 顯示錶格標題
<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 %}
這裏獲得的是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這個view的url的配置, 他不知道哪一個市對的,因此默認是最後一個配置即(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'),
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
找出ID是52的而後更新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 可設置字段容許爲空,即時生效,字段再也不是粗體了
設置日期型和數字型字段可選 ,日期型、時間型和數字型字段不接受空字符串
若是你想容許一個日期型(DateField、TimeField、DateTimeField)或數字型
(IntegerField、DecimalField、FloatField)字段爲空,你須要使用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相關信息---若是返回同一個相關的URL,action=''
屬性/方法 說明 舉例
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; fr‐FR; 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.GET和request.POST是類字典對象
request.GET和request.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_mail是Django的EmailMessage類的一個方便的包裝,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=100|min_length=100 )
設置初始值
可在實例化對象時設定
form = ContactForm(initial={'subject': 'I love your site!'})
自定義校驗規則
自定義長度,自定義提示消息,在類下建立一個方法
Django的form系統自動尋找匹配的函數方法,該方法名稱以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 e‐mail 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}),
無論前端傳什麼值,22或40,URL均以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 special‐case 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只匹配/後面的內容,不包括GET和POST請求
視圖函數的高級概念
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}'
支持字符串和數字,其他格式的好像不支持:
NameError: name 'dddd' is not defined