django 学习笔记 (三)

三、Writing your first Django app, part 3

写第一个视图

  1. 建立 polls/views.py

    # 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.py

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

url() 函数的四个参数

  1. 正则表达式 regex

    • 从上往下顺序查找
    • 不匹配 GET POST 参数
    • 不匹配域名
  2. 视图参数 view

    • HttpRequest 对象作为第一个参数

    • 使用正则表达式捕捉的其他参数

      1. 普通捕捉:位置参数
      2. 命名捕捉:命名参数
  3. 可以给视图 view 传递任意参数 kwargs

  4. urls 的名称 name

    在模版中明确地使用该 urls

再写一个视图

  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 %}">

你可能感兴趣的:(django 学习笔记 (三))