博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
django 学习笔记 (三)
阅读量:7254 次
发布时间:2019-06-29

本文共 4155 字,大约阅读时间需要 13 分钟。

hot3.png

三、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
    \d+)/$', views.detail, name='detail'), # ex: /polls/5/results/ url(r'^(?P
    \d+)/results/$', views.results, name='results'), # ex: /polls/5/vote/ url(r'^(?P
    \d+)/vote/$', views.vote, name='vote'), )

写一个实际功能的视图

每个视图会返回一个结果:

  • HttpResponse 对象
  • Http404

可以直接写在view里面,但是硬编码不好,所以还是使用模版的方式更符合MVC的习惯。

  1. 建立路径 polls/templates

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

    {% if latest_poll_list %}     
    {% else %}

    No polls are available.

    {% 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 %}        
  • {
    { choice.choice_text }}
  • {% endfor %}

    移除模版当中的硬编码

            改写为    

    为了避免不同应用之间的命名冲突,可以使用namespace参数.

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

    转载于:https://my.oschina.net/bailiangcn/blog/225289

    你可能感兴趣的文章
    Hyper-V在线扩展磁盘空间总结
    查看>>
    Microsoft File Transfer Manager
    查看>>
    Hyper-V 3.0 - 存储迁移(简单)
    查看>>
    CentOS 7 Docker方式安装 PHP,Mysql,phpmyadmin 过程记录
    查看>>
    项目质量管理重点
    查看>>
    红冒系列-Systemctl命令详解说明
    查看>>
    Exchange2010开启outlook anywhere
    查看>>
    Linux who 命令 – 显示系统登录者
    查看>>
    (13)Powershell中的比较运算符与位运算符
    查看>>
    linux双网卡策略路由测试
    查看>>
    运维角度浅谈MySQL数据库优化
    查看>>
    如何使用Tunnel SDK上传/下载MaxCompute复杂类型数据
    查看>>
    ORACLE AWR简介
    查看>>
    我的友情链接
    查看>>
    为什么企业核心路由器必须设置时间?
    查看>>
    Action Bar(操作栏)
    查看>>
    好用的ListView adapter
    查看>>
    师兄的2008年华为面试经历
    查看>>
    我的友情链接
    查看>>
    nginx proxy_pass转发路径
    查看>>