django 学习笔记 (三)

[亡魂溺海] 提交于 2019-12-03 18:05:28

三、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 %}">
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!