最近兩天下了班,沒事學習了django的開發,今天作個總結。其實你們能夠從百度,google搜到一些django的入門視頻,初步瞭解一下django的框架。學習一些基礎的概念和知識。本篇主要是對本身這兩天作的作個總結。html
1.建立第一個views.pypython
上一篇文章咱們在windows上搭建好了django的開發環境並創建一個測試demo。數據庫
在settings.py的同級目錄下新建views.py目錄。並輸入如下代碼django
from django.http import HttpResponse def index(req): context="This is main page!!!" return HttpResponse(context)
在urls.py 安裝以下更改windows
urlpatterns = patterns('', # Examples: # url(r'^$', 'drophome.views.home', name='home'), # url(r'^blog/', include('blog.urls')), url(r'^admin/', include(admin.site.urls)), url(r'^index/','drophome.view.index'),
這時在瀏覽器裏打開127.0.0.1:8000/index 就能夠看到咱們第一個view啦。在django的開發中咱們主要採用mvc的模式即Models,view和control。可是這裏的views.py更像control。在urls.py中是經過指定的url的對應view的index的函數。在urls.py 中指定的url是採用python中的正規表達式的形式,方便擴展。瀏覽器
2.利用Templates模板來格式化顯示mvc
在建立一個view.py後咱們是HttpResponse來直接輸出字符串的,若是想要輸出更多,更復雜的內容就會很麻煩,要在代碼寫一些無關的html的標籤。爲此django提供了templats模板的概念,以下是一個模板的樣本app
<html> <head> <title></title> </head> <body> <h1>{{context}}</h1> <table> {% for k,v in items %} <tr> <td> {{k}} </td> <td> {{ v}} </td> </tr> {% endfor %} </table> </body> </html>
能夠保存爲index.html從文件結構上和標準的html文檔沒什麼差異。可是多了{{context}},和{% for .. %} 的東西。框架
期中{{ xxxx }} 表示爲template的變量,因此的變量都是用{{ }} 來比標示,{% for k,v in items %} 是嵌入式的python的語句。用{% xxx %} 能夠嵌入式python的語句。支持for,if,等python語句。那若是在view中使用template中呢。 函數
from django.shortcuts import render_to_response def display_meta(req): values=req.META.items() values.sort() return render_to_response("index.html",{"items":values},)
其實{{context}}咱們沒有給他傳值,所以它不會顯示,也不會報錯。咱們把從req獲取的meta數據傳給了items讓他在index裏面顯示。
要使用template還要在settings裏添加以下代碼
TEMPLATE_DIRS=(os.path.join(BASE_DIR,"templates"),)
並在該項目的同級目錄建立tempaltes的目錄,存放index.html 模板文件。
3.Django的form的使用
在django中使用表單有兩種方式:1.使用template用html定義form。2.使用django的forms類來建立模板。兩種建立模板的方式都是簡單方便。
首先使用template的方式建立form
<html> <head> <title>Contact us</title> </head> <body> <h1>Contact us</h1> {% if errors %} <ul> {% for error in errors %} <li>{{ error }}</li> {% endfor %} </ul> {% endif %} <form action="/contact/" method="post"> <p>Subject: <input type="text" name="subject"></p> <p>Your e-mail (optional): <input type="text" name="email"></p> <p>Message: <textarea name="message" rows="10" cols="50"></textarea></p> <input type="submit" value="Submit"> </form> </body> </html>
在以上的html的中用html的form標籤作了一個form,我咱們看看若是在view處理這個form。
def contact2(request): errors = [] if request.method == 'POST': if not request.POST.get('subject', ''): errors.append('Enter a subject.') if not request.POST.get('message', ''): errors.append('Enter a message.') if request.POST.get('email') and '@' not in request.POST['email']: errors.append('Enter a valid e-mail address.') if not errors: # send_mail( # request.POST['subject'], # request.POST['message'], # request.POST.get('email', 'noreply@example.com'), # ['siteowner@example.com'], # ) return HttpResponseRedirect('/contact/thanks/') return render_to_response('contact_form.html', {'errors': errors})
在view中能夠直接經過request.POST.get('subject','')方式來獲取form裏面的value。
用Django的form類來建立表單,在django提供了form類,實現方式和model的相似。
from django import forms class ContactForm (forms.Form): subject=forms.CharField(max_length=32) email = forms.EmailField(required=False) message = forms.CharField(widget=forms.Textarea) def clean_message(self): msg=self.cleaned_data['message'] num_rows=len(msg.split()) if num_rows<2: raise forms.ValidationError("Not enough words!") return msg
以上就是經過繼承forms.Form 實現form。咱們能夠經過實現clean_filed 的形式針對每一個字段作自定義校驗。也能夠設置每一個字段的屬性。例如
message = forms.CharField(widget=forms.Textarea)
在view中若是使用這個表單。
def contact(request): if request.method == 'POST': form = ContactForm(request.POST) if form.is_valid(): cd = form.cleaned_data # send_mail( # cd['subject'], # cd['message'], # cd.get('email', 'noreply@example.com'), # ['siteowner@example.com'], # ) return HttpResponseRedirect('/contact/thanks/') else: form = ContactForm( initial= {'subject':'I love this site'}) return render_to_response('contact2.html', {'form': form})
也能夠在view中初始化form。
看看template的html的展現時如何使用form
<html> <head> <title>Contact us</title> </head> <body> <h1>Contact us</h1> {% if form.errors %} <p style="color: red;"> Please correct the error{{ form.errors|pluralize }} below. </p> {% endif %} <form action="" method="post"> <table> {{ form.as_table }} </table> <input type="submit" value="Submit"> </form> </body> </html>
到此爲止咱們就瞭解了在django使用表單的方式。
4.在Django中創建models
在django中提供建模的models類。咱們能夠經過繼承該類既能夠實現建立一個表。
對象-關係映射(OBJECT/RELATION MAPPING,簡稱ORM),是隨着面向對象的軟件開發方法發展而產生的。面向對象的開發方法是當今企業級應用開發環境中的主流開發方法,關係數據庫是企業級應用環境中永久存放數據的主流數據存儲系統。對象和關係數據是業務實體的兩種表現形式,業務實體在內存中表現爲對象,在數據庫中表現爲關係數據。內存中的對象之間存在關聯和繼承關係,而在數據庫中,關係數據沒法直接表達多對多關聯和繼承關係。所以,對象-關係映射(ORM)系統通常以中間件的形式存在,主要實現程序對象到關係數據庫數據的映射。
上面這段是引資百度百科,幫助咱們理解這個模型。
from django.db import models from django.contrib.auth.models import User import django.forms as forms # Create your models here. class SBook (models.Model): auth= models.ForeignKey(User) account= models.CharField(max_length=256) passwd = models.CharField(max_length=32,) title = models.CharField(max_length=256) icon = models.CharField(max_length=128) url = models.CharField(max_length=128) def __unicode__(self): return self.account
咱們能夠在terminal中對model能夠作測試操做。此時可使用Pycharm 自帶的terminal便可。
1.建立SBook的instance。
n [4]: from django.contrib.auth.models import User In [5]: user=User.objects.create(username="xcy2",password="123",email="xcy@123.com") In [6]: User.objects.all() Out[6]: [<User: xcy>, <User: xcy1>, <User: xcy4>, <User: xcy2>] In [9]: sbook=SBook.objects.create(auth=user,account="xcy2011sky",passwd="xcy.123",title="baidu.com",) In [10]: SBook.objects.all() Out[10]: [<SBook: xcy2011sky>, <SBook: xcy2011sk>, <SBook: abcde>, <SBook: xcy2011sky>]
咱們要建立SBook的實例,必須先建立user的實例,由於SBook 以來user。也能夠用如下的方式建立
In [11]: sbook=SBook(auth=user,account='alan',passwd='123',title='csdn') In [12]: sbook.save() In [13]: SBook.objects.all() Out[13]: [<SBook: xcy2011sky>, <SBook: xcy2011sk>, <SBook: abcde>, <SBook: xcy2011sky>, <SBook: alan>]
2.修改更新數據:
In [14]: sbook.title='google' In [15]: sbook.save() In [16]: SBook.objects.all() Out[16]: [<SBook: xcy2011sky>, <SBook: xcy2011sk>, <SBook: abcde>, <SBook: xcy2011sky>, <SBook: alan>] In [17]: print sbook.title google
3.刪除一個sbook的。
Out[28]: [<SBook: xcy2011sky>, <SBook: xcy2011sk>, <SBook: abcde>, <SBook: xcy2011sky>, <SBook: alan>] In [29]: print sbook.account alan In [30]: sbook.delete() In [31]: sbook.save() In [34]: SBook.objects.all() Out[34]: [<SBook: xcy2011sky>, <SBook: xcy2011sk>, <SBook: abcde>, <SBook: xcy2011sky>]
4.查詢獲取結果
In [34]: SBook.objects.all() Out[34]: [<SBook: xcy2011sky>, <SBook: xcy2011sk>, <SBook: abcde>, <SBook: xcy2011sky>] In [35]: queryset=SBook.objects.all() In [37]: for q in queryset : ....: print q.account ....: xcy2011sky xcy2011sk abcde xcy2011sky