django 學習筆記 (三)

3、Writing your first Django app, part 3

寫第一個視圖

  1. 創建 polls/views.pyhtml

    # encoding: utf-8
     from django.http import HttpResponse
     def index(request):
         return HttpResponse("Hello, world. You're at the poll index.")
  2. 創建 polls/urls.py正則表達式

    # -*- coding: UTF-8 -*-
     from django.conf.urls import patterns, url
     from polls import views
    
     urlpatterns = patterns('',
         url(r'^$', views.index, name='index')
     )
  3. 在根 urls.py 中 include 新的urls.pydjango

    urlpatterns = patterns('',
         url(r'^polls/', include('polls.urls')),
         url(r'^admin/', include(admin.site.urls)),
     )

url() 函數的四個參數

  1. 正則表達式 regexapp

    • 從上往下順序查找
    • 不匹配 GET POST 參數
    • 不匹配域名
  2. 視圖參數 view函數

    • HttpRequest 對象做爲第一個參數編碼

    • 使用正則表達式捕捉的其餘參數url

      1. 普通捕捉:位置參數
      2. 命名捕捉:命名參數
  3. 能夠給視圖 view 傳遞任意參數 kwargsspa

  4. urls 的名稱 namecode

    在模版中明確地使用該 urlshtm

再寫一個視圖

  1. 在 polls/views.py 中增長几個帶參數的函數定義

    def detail(request, poll_id):
         return HttpResponse("You're looking at poll %s." % poll_id)
    
     def results(request, poll_id):
         return HttpResponse("You're looking at the results of poll %s." % poll_id)
    
     def vote(request, poll_id):
         return HttpResponse("You're voting on poll %s." % poll_id)
  2. 增長 urls

    演示了參數傳遞的效果

    from django.conf.urls import patterns, url
     from polls import views
    
     urlpatterns = patterns('',
         # ex: /polls/
         url(r'^$', views.index, name='index'),
         # ex: /polls/5/
         url(r'^(?P<poll_id>\d+)/$', views.detail, name='detail'),
         # ex: /polls/5/results/
         url(r'^(?P<poll_id>\d+)/results/$', views.results, name='results'),
         # ex: /polls/5/vote/
         url(r'^(?P<poll_id>\d+)/vote/$', views.vote, name='vote'),
     )

寫一個實際功能的視圖

每一個視圖會返回一個結果:

  • HttpResponse 對象
  • Http404

能夠直接寫在view裏面,可是硬編碼很差,因此仍是使用模版的方式更符合MVC的習慣。

  1. 創建路徑 polls/templates

  2. 創建 polls/templates/polls/index.html

    {% if latest_poll_list %}
         <ul>
         {% for poll in latest_poll_list %}
             <li><a href="/polls/{{ poll.id }}/">{{ poll.question }}</a></li>
         {% endfor %}
         </ul>
     {% else %}
         <p>No polls are available.</p>
     {% endif %}
  3. 修改 polls/views.py , 使用index.html模版

    from django.http import HttpResponse
     from django.template import RequestContext, loader
    
     from polls.models import Poll
    
     def index(request):
         latest_poll_list = Poll.objects.order_by('-pub_date')[:5]
         template = loader.get_template('polls/index.html')
         context = RequestContext(request, {
             'latest_poll_list': latest_poll_list,
         })
         return HttpResponse(template.render(context))
  4. 使用快捷方式 render() 來減小編碼

    from django.shortcuts import render
    
     from polls.models import Poll
    
     def index(request):
         latest_poll_list = Poll.objects.all().order_by('-pub_date')[:5]
         context = {'latest_poll_list': latest_poll_list}
         return render(request, 'polls/index.html', context)

快捷方式 render()

  • 參數

    1. request
    2. 模版文件
    3. context
  • 返回

    1. HttpResponse 對象

      from django.shortcuts import render
      
       from polls.models import Poll
      
       def index(request):
           latest_poll_list = Poll.objects.all().order_by('-pub_date')[:5]
           context = {'latest_poll_list': latest_poll_list}
           return render(request, 'polls/index.html', context)

引起一個404異常

  1. 導入 Http404 from django.http import Http404

  2. 拋出異常 raise Http404

    from django.http import Http404
     # ...
     def detail(request, poll_id):
         try:
             poll = Poll.objects.get(pk=poll_id)
         except Poll.DoesNotExist:
             raise Http404
         return render(request, 'polls/detail.html', {'poll': poll})
  3. 經過使用 快捷方式 get_object_or_404() 來減小代碼

    from django.shortcuts import render, get_object_or_404
     # ...
     def detail(request, poll_id):
         poll = get_object_or_404(Poll, pk=poll_id)
         return render(request, 'polls/detail.html', {'poll': poll})
  4. 本身寫一個 404 頁面

    • 模版根目錄下創建一個 404.html

    • 經過在根的 urls.py 中設置handler404 變量指定自定義視圖

      # 例子
        # polls/views.py中增長一個函數
            def no_page(request):
                return HttpResponse("Can't found poll ." )
      
        # 根 urls.py 中增長
            from polls import views
      
            handler404 = views.no_page

    注意:

    1. DEBUG 必須是False ,不然無效果
    2. 本地開發要設置容許本地訪問 ALLOWED_HOSTS = ['localhost',]

使用模版系統

模版的搜索順序

  1. 對象
  2. 屬性
  3. 列表循環

循環

{% for choice in poll.choice_set.all %}
        <li>{{ choice.choice_text }}</li>
    {% endfor %}

移除模版當中的硬編碼

<a href="/polls/{{ poll.id }}/">
        改寫爲
    <a href="{% url 'detail' poll.id %}">

爲了不不一樣應用之間的命名衝突,可使用namespace參數.

  1. 在根 urls.py 中, url(r'^polls/', include('polls.urls', namespace="polls")),
  2. 模版中 <a href="{% url 'polls:detail' poll.id %}">
相關文章
相關標籤/搜索