1、安裝Djangocss
下載地址:https://www.djangoproject.com/download/html
一、tar zxvf Django-1.8.10.tar.gzpython
二、cd Django-1.8.10mysql
三、python setup.py installgit
2、建立一個Django項目
web
django-admin startproject sitename正則表達式
經常使用命令:sql
python manage.py runserver 0.0.0.0
python manage.py startapp appname
python manage.py syncdb數據庫
# 集成已有數據庫的應用,經過數據庫生成model類django
python manage.py inspectdb
# 經過model類生成數據庫
python manage.py makemigrations
python manage.py migrate
3、URL路由
一、每一個路由規則對應一個view中的函數
from django.conf.urls import include, url from django.contrib import admin from views import * urlpatterns = [ url('^hello/$',hello), url('^time/$',current_datetime), url(r'^time/plus/(\d{1,2})/$',hours_ahead), ]
二、根據app對應路由規則的分類
url(r'^web1/',include('web1.urls'))
app:web1.urls
from django.conf.urls import include, url, patterns from django.contrib import admin from web1.views import * urlpatterns = patterns('', url(r'^add/(?P<name>\w*)&(?P<not_name>\w*)/$',Add), url(r'^del/(?P<id>\d*)/$',Delete), url(r'^Update/(?P<id>\d*)&(?P<name>\w*)/$',Update), )
添加app到框架應用
INSTALLED_APPS = ( 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'ops01', )
4、數據庫操做
一、配置:
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME':'dbname', 'USER': 'root', 'PASSWORD': 'xxx', 'HOST': '', 'PORT': '', } }
二、根據models.Model建立數據表
#!/usr/local/python27/bin/python2.7 # coding:utf8 # Create your models here. from django.db import models class UserInfo2(models.Model): username = models.CharField(max_length=50) password = models.CharField(max_length=50) memo = models.CharField(max_length=50) class args(models.Model): id = models.AutoField(primary_key = True) name = models.CharField(max_length=20,null=True) not_name = models.CharField(max_length=20,null=False) create_data = models.DateTimeField(auto_now_add = True) update_date = models.DateTimeField(auto_now = True,error_messages={"invalid":'日期格式錯誤'})
三、更多字段:
一、models.AutoField # 自增列 = int(11) 若是沒有的話,默認會生成一個名稱爲 id 的列,若是要顯示的自定義一個自增列,必須將給列設置爲主鍵 primary_key=True。 二、models.CharField # 字符串字段必須 max_length 參數 三、models.BooleanField 布爾類型=tinyint(1) # 不能爲空,Blank=True 四、models.ComaSeparatedIntegerField # 用逗號分割的數字=varchar 繼承CharField,因此必須 max_lenght 參數 五、models.DateField # 日期類型 date 對於參數,auto_now = True 則每次更新都會更新這個時間;auto_now_add 則只是第一次建立添加,以後的更新再也不改變。 六、models.DateTimeField # 日期類型 datetime 同DateField的參數 七、models.Decimal # 十進制小數類型 = decimal 必須指定整數位max_digits和小數位decimal_places 八、models.EmailField # 字符串類型(正則表達式郵箱)=varchar 對字符串進行正則表達式 九、models.FloatField # 浮點類型 = double 十、models.IntegerField # ××× 十一、models.BigIntegerField # 長××× integer_field_ranges = { 'SmallIntegerField': (-32768, 32767), 'IntegerField': (-2147483648, 2147483647), 'BigIntegerField': (-9223372036854775808, 9223372036854775807), 'PositiveSmallIntegerField': (0, 32767), 'PositiveIntegerField': (0, 2147483647), } 十二、models.IPAddressField # 字符串類型(ip4正則表達式) 1三、models.GenericIPAddressField # 字符串類型(ip4和ip6是可選的) # 參數protocol能夠是:both、ipv四、ipv6 # 驗證時,會根據設置報錯 1四、models.NullBooleanField # 容許爲空的布爾類型 1五、models.PositiveIntegerFiel # 正Integer 1六、models.PositiveSmallIntegerField # 正smallInteger 1七、models.SlugField # 減號、下劃線、字母、數字 1八、models.SmallIntegerField # 數字 數據庫中的字段有:tinyint、smallint、int、bigint 1九、models.TextField # 字符串=longtext 20、models.TimeField # 時間 HH:MM[:ss[.uuuuuu]] 2一、models.URLField # 字符串,地址正則表達式 2二、models.BinaryField # 二進制 2三、models.ImageField # 圖片 2四、models.FilePathField # 文件
四、更多字段參數:
一、null=True # 數據庫中字段是否能夠爲空 二、blank=True # django的 Admin 中添加數據時是否可容許空值 三、primary_key = False # 主鍵,對AutoField設置主鍵後,就會代替原來的自增 id 列 四、auto_now 和 auto_now_add # auto_now 自動建立---不管添加或修改,都是當前操做的時間 # auto_now_add 自動建立---永遠是建立時的時間 五、choices # GENDER_CHOICE = ( # (u'M', u'Male'), # (u'F', u'Female'), # ) # gender = models.CharField(max_length=2,choices = GENDER_CHOICE) 六、max_length 七、default # 默認值 八、verbose_name # Admin中字段的顯示名稱 九、name|db_column # 數據庫中的字段名稱 十、unique=True # 不容許重複 十一、db_index = True # 數據庫索引 十二、editable=True # 在Admin裏是否可編輯 1三、error_messages=None # 錯誤提示 1四、auto_created=False # 自動建立 1五、help_text # 在Admin中提示幫助信息 1六、validators=[] 1七、upload-to
五、數據庫操做
from django.shortcuts import render from web1.models import * from django.http import HttpResponse from django.db.models import Min,Max,Sum from django.db import connection,transaction # Create your views here. # 添加數據 def Add(request,name,not_name): args.objects.create(not_name=not_name,name=name) return HttpResponse('ok') # 刪除數據 def Delete(request,id): args.objects.get(id=id).delete() return HttpResponse('delete ok') # 更新數據,單行更新 def Update(request,id,name): obj = args.objects.get(id=id) obj.name = name obj.save() return HttpResponse('update ok') # 根據id大於等於的條件,多行更新 args.objects.filter(id__gt=id).update(name=name) return HttpResponse('multi update ok') # 根據id小於等於的條件,多行更新,也能夠用於多行刪除 args.objects.filter(id__lt=id).update(name=name) return HttpResponse('multi update ok') # 根據等於的條件多行操做 args.objects.filter(id=id).update(name=name) return HttpResponse('multi update ok') #還能夠經過filter(id__in = [1,2,3])進行多行操做 # 模糊查詢 obj = args.objects.filter(name__contains=name) # 模糊查詢(忽略大小寫) obj = q.exclude(body_text__icontains="food") # -------- 條件查詢更多參數 ------------- # 表示!= exclude # 去重複 querySet.distinct() # 精確等於 like 'aaa' __exact # 精確等於 忽略大小寫 ilike 'aaa' __iexact # 包含 like '%aaa%' __contains # 包含,忽略大小寫 ilike '%aaa%',可是對於sqlite來講,contains的做用效果等同於icontains。 __icontains # 大於 _gt # 大於等於 __gte # 小於 __lt # 小於等於 __lte # 存在於一個list範圍內 __in # 以...開頭 __startswith # 以...開頭 忽略大小寫 __istartswith # 以...結尾 __endswith # 以...結尾,忽略大小寫 __iendswith # 在...範圍內 __range # 日期字段的年份 __year # 日期字段的月份 __month # 日期字段的日 __day # 空集 __isnull=True/False # 擴展學習,示例 # 大於 p1 = Permission.objects.all().filter(content_type_id__gt=12) # 大於等於 p1 = Permission.objects.all().filter(content_type_id__gte=12) # 去重 p1 = Permission.objects.all().filter(content_type_id__gte=12).distinct() # 前綴查詢 q1 = Entry.objects.filter(headline__startswith="What") # 排除 q2 = q1.exclude(pub_date__gte=datetime.date.today()) # 操做時間 q1.filter(pub_date__gte=datetime.date.today())表示爲時間>=now, q1.exclude(pub_date__gte=datetime.date.today())表示爲<=now ''' 關於緩存: queryset是有緩存的,a = A.objects.all(),print [i for i in a]. 第一次執行打印會查詢數據庫,而後結果會被保存在queryset內置的cache中, 再執行print的時候就會取自緩存。 不少時候會遇到僅需判斷queryset是否爲空的狀況,能夠 1. if queryset:pass 2.if queryset.count>0:pass 3.if queryset.exists():pass. 三種方式性能依次提高。 當queryset很是巨大時,cache會成爲問題。 此時能夠queryset.iterator(),迭代器的用處就很少說了,根據具體需求狀況使用。 ''' # 經過values()指定獲取單列數據。 alldata = args.objects.all().values('id') alldata = args.objects.values('id') # 獲取單列去重數據 alldata = args.objects.values('id').distinct() # 獲取指定行數據,[0:3] 從0行開始向下獲取3行數據 def get_limit(request): alldata = args.objects.all()[0:3] print alldata.query return HttpResponse(alldata) # 排序 ,(‘-id’)爲逆序 alldata = args.objects.all().order_by('id') alldata = args.objects.all().order_by('-id') # 聚合函數 def juhe(request): alldata = args.objects.aggregate(Max('id')) print alldata return HttpResponse(alldata) # 使用自定義的原生SQL語句 ''' cursor = connection.cursor() cursor.execute('SELECT DISTINCT first_name ROM people_person WHERE last_name = %s', ['Lennon']) row = cursor.fetchone() ''' # 實例: def sour_sql(request,id): cursor = connection.cursor() cursor.execute('''SELECT id FROM web1_args where id > %s ''' % id ) row = cursor.fetchall() print row return HttpResponse(row) # 經過調用SQL 函數inet_aton()將IP地址轉爲INT格式存儲 cursor = connection.cursor() cursor.execute("SELECT inet_aton('%s')" % wip) data = cursor.fetchall() sqldatawip = data[0][0] cursor.execute("SELECT inet_aton('%s')" % lip) data = cursor.fetchall() sqldatalip = data[0][0]
5、模版語言
一、模版文件夾路徑配置
Django1.8 setting.py
TEMPLATES = [ { 'BACKEND': 'django.template.backends.django.DjangoTemplates', # 配置模版文件夾路徑 'DIRS': [os.path.join(BASE_DIR, 'templates')] , 'APP_DIRS': True, 'OPTIONS': { 'context_processors': [ 'django.template.context_processors.debug', 'django.template.context_processors.request', 'django.contrib.auth.context_processors.auth', 'django.contrib.messages.context_processors.messages', ], }, }, ]
二、判斷語句編寫格式
# 判斷 {% if not user %} <h2>have data</h2> {% else %} <h2>haven't data</h2> {% endif %} # 取反判斷 {% if not user %} <h2>have data</h2> {% else %} <h2>haven't data</h2> {% endif %} # ifequal/ifnotequal 等價判斷,user 是否等於 'tuchao' {% ifequal user 'tuchao' %} <h3>right!</h3> {% else %} <h3>error!</h3> {% endifequal %}
三、循環語句編寫
# 循環裝有數據的表格,使得頁面中有格式的顯示數據 {% for item in data %} <tr> <td>`item`.`id`</td> <td>{% mymethod item.id %}</td> <td>`item`.`name`</td> <td>`item`.`not_name`</td> <td>{{item.create_data|date:"Y-m-d H:i:s"}}</td> <td>{{item.update_date|date:"Y-m-d H:i:s"}}</td> </tr> {% endfor %} # 給標籤增長一個 reversed 使得該列表被反向迭代: {% for athlete in athlete_list reversed %} ... {% endfor %} # 先檢查列表是否有數據再循環 {% if athlete_list %} {% for athlete in athlete_list %} <p>{{ athlete.name }}</p> {% endfor %} {% else %} <p>There are no athletes. Only computer programmers.</p> {% endif %} # `` for`` 標籤支持一個可選的`` {% empty %}`` 分句,經過它咱們能夠定義當列表爲空時的輸出內容 下面的例子與以前那個等價: {% for athlete in athlete_list %} <p>{{ athlete.name }}</p> {% empty %} <p>There are no athletes. Only computer programmers.</p> {% endfor %} # forloop.counter 老是一個表示當前循環的執行次數的整數計數器。 這個計數器是從1開始的,因此在第一次循環時 forloop.counter 將會被設置爲1。 {% for item in todo_list %} <p>{{ forloop.counter }}: {{ item }}</p> {% endfor %} # forloop.last 是一個布爾值;在最後一次執行循環時被置爲True。 一個常見的用法是在一系列的連接之間放置管道符(|) {% for link in links %}{{ link }}{% if not forloop.last %} | {% endif %}{% endfor %} # 上面的模板可能會產生以下的結果: Link1 | Link2 | Link3 | Link4 # 另外一個常見的用途是爲列表的每一個單詞的加上逗號。 # Favorite places: {% for p in places %}{{ p }}{% if not forloop.last %}, {% endif %}{% endfor %}
四、過濾器
模版過濾器是在變量被顯示前修改它的值的一個簡單方法
# 內容變量 name 被過濾器lower處理-轉換文本爲小寫 {{ name|lower }} # 過濾管道能夠被* 套接* ,既是說,一個過濾器管道的輸出又能夠做爲下一個管道的輸入 # 實現查找列表的第一個元素並將其轉化爲大寫 {{ my_list|first|upper }} # 顯示 bio變量的前30個字符 {{ bio|truncatewords:"30" }} # date 按照指定的格式,格式化date和datetime對象 {{create_data|date:"Y-m-d H:i:s"}} {{update_date|date:"Y-m-d H:i:s"}} {{delete_date|date:"F j, Y" }} # addslashes : 添加反斜槓到任何反斜槓、單引號或者雙引號前面。 這在處理包含JavaScript的文本時是很是有用的。
五、自定義模版方法
一、在app目錄下建立templatetags文件夾,用於保存自定義方法文件
二、建立__init__.py文件
三、建立任意.py文件編寫自定義方法
# 代碼實例 hand.py #!/usr/local/python27/bin/python2.7 #coding:utf-8 from django import template from django.template.base import resolve_variable, Node, TemplateSyntaxError register = template.Library() #上面的均爲固定格式,注意這裏定義的方法必須被本身實例化的對象裏的裝飾器@register.simple_tag)進行裝飾纔有效 @register.simple_tag def mymethod(v1): result = v1*1000 return result
Html調用自定義模版方法
{% extends "master/moban.html" %} {% block content %} <!-- 載入自定義方法文件 --> {% load hand %} <table border='1'> {% for item in data %} <tr> <td>`item`.`id`</td> <!-- 調用自定義方法,將id值乘1000返回 --> <td>{% mymethod item.id %}</td> <td>`item`.`name`</td> <td>`item`.`not_name`</td> </tr> {% endfor %}
六、模版的繼承
當咱們在開發一個動態站點的時候,會發如今整個站點中不少頁面的樣式,圖片、Logo、導航欄等等都有相同的部分,那咱們如何減小這些冗餘代碼呢? 下面經過學習父板及子板繼承關係的方式來解決
# 定義一個父模版,其中的block塊是子板能夠重載的部分。 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"> <html lang="en"> <head> <title>{% block title %}{% endblock %}</title> </head> <body> <h1>My helpful timestamp site</h1> {% block content %}{% endblock %} {% block footer %} <hr> <p>Thanks for visiting my site.</p> {% endblock %} </body> </html> # 建立一個子板,繼承父模版 # 該標記用於指定繼承自哪一個父模版,必須保證其爲模板中的第一個模板標記。 不然,模板繼承將不起做用。 {% extends "base.html" %} # 重載子板的title部分 {% block title %}The current time{% endblock %} # 重載子板的內容部分 {% block content %} <p>It is now {{ current_date }}.</p> {% endblock %} # 這個子模版的title 和 body 內容部分都本身定製不繼承自父模版,剩下沒有被重載的任何部分都繼承自父模版,如{% block footer %} 部分。
6、Django-form表單
Django 提供一個form.Form類能夠快速實現表單的功能,並且提供便捷的方式解決了驗證提交數據的格式是否合法的問題。
一、在app目錄下建立一個forms.py的文件
# 實例代碼 #!/usr/local/python27/bin/python2.7 # coding=utf8 # noinspection PyUnresolvedReferences from django import forms # 定義一部分須要用到的表單,attrs屬性用於定義該表單的樣式信息。 指定的樣式須要在對應的CSS文件中編寫。 class RegisterForm(forms.Form): username = forms.CharField(widget=forms.TextInput(attrs={'class':'user_name'})) password = forms.CharField(widget=forms.PasswordInput(attrs={'class':'pwd'})) real_name = forms.CharField(widget=forms.TextInput) email = forms.EmailField(required=True,error_messages={'invalid':'郵箱格式錯誤'}) gender = forms.BooleanField() class AdminHostAdd(forms.Form): othername = forms.CharField(widget=forms.TextInput(attrs={'class':'othername'})) hostname = forms.CharField(widget=forms.TextInput(attrs={'class':'hostname'})) hardconfig = forms.CharField(widget=forms.TextInput(attrs={'class':'hardconfig'})) wip = forms.IPAddressField() lip = forms.IPAddressField()
二、views.py 文件中調用實例代碼
#!/usr/local/python27/bin/python2.7 # coding=utf8 # noinspection PyUnresolvedReferences from django.shortcuts import render # 從定義的forms.py文件中導入類 from ops01.forms import RegisterForm,AdminHostAdd from django.http import HttpResponse from django.shortcuts import render_to_response from ops01.models import * from django.db import connection,transaction # 用戶註冊函數 def Register(request): reg = RegisterForm() # 實例化 if request.method == 'POST': form = RegisterForm(request.POST) # 判斷提交的表單數據,是否符合表單定義的數據格式。 if form.is_valid(): # 獲取提交的全部數據,這裏會返回一個字典對象 data = form.cleaned_data username = data.get('username') password = data.get('password') realname = data.get('real_name') email = data.get('email') try: # 數據庫操做,將合法的數據記錄到數據庫 user.objects.create(username=username,password=password,realname=realname,email=email) except e: print (e) print data else: temp = form.errors.as_data() print temp print type(temp) # 在返回結果的時候將實例化的form對象reg嵌套進Html一塊兒返回 return render_to_response('register.html',{'form':reg,'status':'註冊失敗'}) return render_to_response('register.html',{'form':reg}) # 主機信息添加函數 def hostinfoadd(request): hostadd = AdminHostAdd() if request.method == 'POST': form = AdminHostAdd(request.POST) if form.is_valid(): data = form.cleaned_data hostname = data.get('hostname') othername = data.get('othername') wip = data.get('wip') lip = data.get('lip') hardconfig = data.get('hardconfig') cursor = connection.cursor() cursor.execute("SELECT inet_aton('%s')" % wip) data = cursor.fetchall() sqldatawip = data[0][0] cursor.execute("SELECT inet_aton('%s')" % lip) data = cursor.fetchall() sqldatalip = data[0][0] try: host.objects.create(othername=othername,hostname=hostname,wanip=sqldatawip,lanip=sqldatalip,hardconfig=hardconfig) except e: print e return render_to_response('admin-host-add.html',{'form':hostadd,'status':'記錄添加成功!'}) else: return render_to_response('admin-host-add.html',{'form':hostadd,'status':'數據格式錯誤!'}) return render_to_response('admin-host-add.html',{'form':hostadd})
三、對應的部分Html實例代碼
# 註冊頁面 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>帳戶註冊</title> <style type="text/css" > .title{ font-size: 25px; font-weight: bold; display: block; margin-left: 46%; margin-top: 40px; } .regdiv{ background: #FFF; height: 500px; width: 450px; left: 470px; position: relative; top: 53px; } .reghead{ height: 41px; position: absolute; width: 100%; top: 30px; line-height: 0px; border-bottom: 1px solid #F2F2F2; } .reghead h3{ font-size: 21px; left: 19px; display: block; position: absolute; } .r_name{ height: 50px; position: absolute; width: 100%; top: 105px; left: 12px; } .u_name{ height: 30px; position: absolute; width: 100%; top: 180px; left: 12px; } .passwd{ height: 30px; position: absolute; top: 255px; left: 12px; } .mail{ height: 30px; top: 327px; position: absolute; width: 100%; left: 12px; } .mail input{ height:30px; width: 300px; } .r_name input{ width: 300px; height: 30px; } .user_name { height: 30px; width: 300px; } .pwd{ width: 300px; height: 30px; } .sub { height: 32px; position: absolute; bottom: 42px; left: 83px; } .sub input { padding: 8px; width: 300px; background-color: rgb(53, 84, 146); font-size: 20px; font-weight: bold; color: #FFF; } .gd{ bottom: 94px; left: 80px; font-size: 14px; position: absolute; } .failstatus{ color: #ff2d28; width: 222px; display: block; position: absolute; height: 51px; left: 141px; top: 32px; font-size: 28px; font-family: "Microsoft YaHei"; font-weight: bold; letter-spacing: 14px; } </style> </head> <body style="background:#D6E4FF; margin:0px auto; height:920px;"> <span class="title">Regsiter Page</span> <div class="regdiv"> <div class="reghead"><h3>註冊</h3></div> <!-- 經過模版語言調用經過 render_to_response 方法傳入的字典對象 --> <span class="failstatus">{{ status }}</span> <form action="/ops01/reg/" method="post"> <!-- 經過模版語言的格式調用form --> <div class="r_name">真實姓名:{{ form.real_name }}</div> <div class="u_name">用 戶 名:{{ form.username }}</div> <div class="passwd">密 碼:{{ form.password }}</div> <div class="mail">郵 箱:{{ form.email }}</div> <div class="gd">{{ form.gender }}我已經贊成<a href="#">隱私政策、服務條款</a></div> <div class="sub"><input type="submit" value="注 冊" /></div> </form> </div> </body> </html> <!-- -------------------------------------------------------------------------------- --> <!-- 主機信息添加頁 --> {% extends "masterplate.html" %} {% block title %}主機添加{% endblock %} {% block content %} <div class="admin-content-admin-host-add content_font"> <div class="am-cf am-padding"> <div class="am-fl am-cf"><strong class="am-text-primary am-text-lg">主機信息添加</strong> / <small>Host information add</small></div> </div> <hr /> <form action="/ops01/hostadd/" method="post"> <div style="margin-left: 20px;"> 主機名<hr /> {{ form.hostname }}<hr /> </div> <div style="margin-left: 20px;"> 別名<hr /> {{ form.othername }}<hr /> </div> <div style="margin-left: 20px;"> 外網IP<hr /> <div class="wipdiv">{{ form.wip }}</div><hr /> </div> <div style="margin-left: 20px;"> 內網IP<hr /> <div class="lipdiv">{{ form.lip }}</div><hr /> </div> <div style="margin-left: 20px;"> 硬件配置<hr /> {{ form.hardconfig }}<hr /> </div> <span class="hostaddstatus">{{ status }}</span> <div class="hostaddbottomdiv"><input type="submit" class="hostaddbottom" name="hostinfosubmit" value="提交至數據庫" /></div> </form> </div> {% endblock %} <!-- -------------------------------------------------------------------------------- --> <!-- 主機列表頁面 --> {% extends "masterplate.html" %} {% block title %}主機列表{% endblock %} {% block content %} <div class="admin-content"> <div class="am-cf am-padding"> <div class="am-fl am-cf"><strong class="am-text-primary am-text-lg">主機列表</strong> / <small>Host information</small></div> </div> <table border="1" class="hovertable"> <tr> <th>主機ID</th><th>主機名</th><th>所屬業務</th><th>內網IP</th><th>外網IP</th><th>配置信息</th> </tr> {% for i in list %} <tr onmouseover="this.style.backgroundColor='#ffff66';" onmouseout="this.style.backgroundColor='#d4e3e5';"> <td>{{ i.hid }}</td> <td>{{ i.hostname }}</td> <td>{{ i.othername }}</td> <td>{{ i.wanip }}</td> <td>{{ i.lanip }}</td> <td>{{ i.hardconfig }}</td> </tr> {% endfor %} </table> </div> {% endblock %}
7、靜態文件存放配置
STATIC_URL = '/static/' STATICFILES_DIRS = ( os.path.join(BASE_DIR,'static'), )