windows上Python開發--3.Django的基礎知識

最近兩天下了班,沒事學習了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
相關文章
相關標籤/搜索