`
剑事
  • 浏览: 62974 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Django 1.0 中文文档-----指导 第四部分 编写表单

阅读更多

编写一个简单的表单

 

我们更新下投票详情(“polls/detail.html”) ,加入<form>元素

 

<h1>{{ poll.question }}</h1>

{% if error_message %}<p><strong>{{ error_message }}</strong></p>{% endif %}

<form action="/polls/{{ poll.id }}/vote/" method="post">
{% for choice in poll.choice_set.all %}
    <input type="radio" name="choice" id="choice{{ forloop.counter }}" value="{{ choice.id }}" />
    <label for="choice{{ forloop.counter }}">{{ choice.choice }}</label><br />
{% endfor %}
<input type="submit" value="Vote" />
</form>

 

简短概要分析

 

  • 上面模板为每个投票选项显示了一个单选钮. 单选钮的值关联到每个选项的ID, 每个单选钮都命名为"choice". 这表示, 当一个选择一个然后提交,将会发送数据如choice=3.
  • 我们设置表单的 action 为 /polls/{{ poll.id }}/vote/, 并且设置 method="post". 使用 method="post" (不要用 method="get") 是很重要的, 因为提交后表单数据会在服务端修改.每当创建服务端修改的表单,使用 method="post". 这个建议不仅限于Django; 这是一个很好的WEB开发习惯.
  • forloop.counter 索引表示 for 循环通过了几次
  •  

    现在我们建立视图来处理提交的数据,还记得我们讲过的 URLconf

     

    (r'^(?P<poll_id>\d+)/vote/$', 'mysite.polls.views.vote'),

    我们在mysite/polls/views.py:中创建vote()函数。

     

    from django.shortcuts import get_object_or_404, render_to_response
    from django.http import HttpResponseRedirect
    from django.core.urlresolvers import reverse
    from mysite.polls.models import Choice, Poll
    # ...
    def vote(request, poll_id):
        p = get_object_or_404(Poll, pk=poll_id)
        try:
            selected_choice = p.choice_set.get(pk=request.POST['choice'])
        except (KeyError, Choice.DoesNotExist):
            # Redisplay the poll voting form.
            return render_to_response('polls/detail.html', {
                'poll': p,
                'error_message': "You didn't select a choice.",
            })
        else:
            selected_choice.votes += 1
            selected_choice.save()
            # Always return an HttpResponseRedirect after successfully dealing
            # with POST data. This prevents data from being posted twice if a
            # user hits the Back button.
            return HttpResponseRedirect(reverse('mysite.polls.views.results', args=(p.id,)))
    

     

     

  • request.POST 是提交数据的字典(POST方式). 这里, request.POST['choice'] 得到选着的选项ID, 字符类型. request.POST 值都是字符.

    注意Django也提供 request.GET 接受GET请求的参数-- 但是我们实际用的 request.POST 在代码 里, 确保数据为POST提交.

  • request.POST['choice'] 这样写如果POST里没有choice参数会发生异常 .

  • 增加选项之后,代码返回一个 HttpResponseRedirect 而不是普通的 HttpResponse. HttpResponseRedirect 有一个参数: URL将会被重定向 。

    当成功处理完提交数据后返回一个 HttpResponseRedirect 也是个好的WEB开发习惯.

  • 我们使用 reverse() 函数在 HttpResponseRedirect 构造器. 会把参数传递给指定的视图。

  • '/polls/3/results/'

     

    投票完成会跳到结果视图

     

    def results(request, poll_id):
        p = get_object_or_404(Poll, pk=poll_id)
        return render_to_response('polls/results.html', {'poll': p})
    

     

     

    创建 result.html 模板

     

    <h1>{{ poll.question }}</h1>
    
    <ul>
    {% for choice in poll.choice_set.all %}
        <li>{{ choice.choice }} -- {{ choice.votes }} vote{{ choice.votes|pluralize }}</li>
    {% endfor %}
    </ul>
    

     

     

     

    使用一般视图:写更少的代码

     

    from django.conf.urls.defaults import *
    
    urlpatterns = patterns('mysite.polls.views',
        (r'^$', 'index'),
        (r'^(?P<poll_id>\d+)/$', 'detail'),
        (r'^(?P<poll_id>\d+)/results/$', 'results'),
        (r'^(?P<poll_id>\d+)/vote/$', 'vote'),
    )
    

     

     

    改成如下

    from django.conf.urls.defaults import *
    from mysite.polls.models import Poll
    
    info_dict = {
        'queryset': Poll.objects.all(),
    }
    
    urlpatterns = patterns('',
        (r'^$', 'django.views.generic.list_detail.object_list', info_dict),
        (r'^(?P<object_id>\d+)/$', 'django.views.generic.list_detail.object_detail', info_dict),
        url(r'^(?P<object_id>\d+)/results/$', 'django.views.generic.list_detail.object_detail', dict(info_dict, template_name='polls/results.html'), 'poll_results'),
        (r'^(?P<poll_id>\d+)/vote/$', 'mysite.polls.views.vote'),
    )
    

     

    我们使用了两个一般视图: object_list()object_detail(). 两个抽象的视图分别显示一个 列表对象 和一个详细内容对象。

     

    • 每个一般视图需要知道显示那些数据,数据通过字典提供,queryset 对应了数据列表
    • object_detail() 一般视图会从URL上俘获ID值,名字是"object_id",所以我们需要把poll_id 改成 object_id
    • poll_results (见原文)

    2
    0
    分享到:
    评论
    1 楼 advanimal 2009-03-14  
    非常感谢!

    不过,还有一步:

    默认情况下,一般视图使用名称为 <app name>/<model name>_detail.html 的模板。在我们的实例里,它是 polls/poll_detail.html。因此,将 polls/detail.html 重命名为 polls/poll_detail.html ,同时改变 vote() 中的 render_to_response() 相应参数。

    同样,通用视图使用 <app name>/<model name>_list.html 的模板。因此,将 polls/index.html 重命名为 polls/poll_list.html 。

    相关推荐

      django1.0文档

      **Django 1.0 文档概述** Django 1.0 是一个强大的开源 Web 开发框架,基于 Python 语言,旨在使 web 应用程序的创建变得快速、简单且实用。这个“django1.0文档”是官方提供的详尽指南,包含了关于 Django 1.0 的...

      Django 1.0 中文文档.doc

      《Django 1.0 中文文档》是一个详尽的指南,主要针对初学者,旨在帮助读者快速掌握Django框架的基础知识。在这个文档中,首先介绍了如何编写你的第一个Django程序,通过创建一个简单的投票应用来引导学习者逐步了解...

      PyPI 官网下载 | django-tables2-column-shifter-0.3.0.tar.gz

      4. **文档**:应该包含了详细的使用文档,指导开发者如何集成到自己的项目中,以及如何配置和定制化。 5. **示例**:可能提供了一些示例代码或模板,帮助开发者快速理解和使用该插件。 在实际开发中,使用`django-...

      Python库 | django_admin_multilang-1.0-py3-none-any.whl

      标题"Python库 | django_admin_multilang-1.0-py3-none-any.whl"提到了一个Python库,名为`django_admin_multilang`,版本为1.0,它是一个适用于Python 3的软件包。`.whl`文件是一种预编译的Python轮子(wheel)包...

      高效易用Django流程引擎源码 - django-lb-workflow

      项目概述:django-lb-workflow 是一个基于Python的高效易用Django流程引擎源码,旨在轻松集成至现有系统。该项目主要由68个Python文件、30个HTML文件以及其他相关文件构成,共计136个文件。其中还包括了HTML模板、...

      Python库 | django-select2-forms-3.0.0.tar.gz

      1. **自动绑定**:`django-select2-forms` 能自动将 Select2 绑定到 Django 表单的字段上,无需编写额外的 JavaScript 或 CSS 代码。 2. **数据加载**:支持动态加载数据,这对于处理大型或远程数据集非常有用,...

      django-python3-ldap, python 3的Django LDAP用户身份验证后端.zip

      django-python3-ldap, python 3的Django LDAP用户身份验证后端 django-python3-ldapdjango-python3-ldap 为 python 2和 3提供了一个 Django LDAP用户身份验证后端。特性使用LDAP服务器验证用户身份。将LDAP用户与...

      Python库 | djangocms_algolia-1.3.1.0-py3-none-any.whl

      资源分类:Python库 所属语言:Python 资源全名:djangocms_algolia-1.3.1.0-py3-none-any.whl 资源来源:官方 安装方法:https://lanzao.blog.csdn.net/article/details/101784059

      PyPI 官网下载 | Files.com-1.0.468-py3-none-any.whl

      《PyPI官网下载:Files.com-1.0.468-py3-none-any.whl——Python后端开发的关键资源》 在Python的世界里,PyPI(Python Package Index)是开发者们的重要宝库,它提供了丰富的第三方库和模块,极大地扩展了Python的...

      django3-cas-ng-4.0.0.tar.gz

      为支持django3对django_cas_ng进行修改 **Features** - Support CAS version 1.0, 2.0, 3.0 - Support Single Sign Out - Configuration of services via the django Admin application - Fine control on ...

      Django docs-1.11-en

      - **Writing your first Django app, part 1-7 (编写你的第一个 Django 应用, 第 1 至 7 部分)**: 通过一系列教程引导读者完成一个完整的应用开发过程。 - **Advanced tutorial: How to write reusable apps (进阶...

      django-admin-bootstrap-master.zip

      1. **Django**:Django是一个用Python编写的开源Web框架,遵循“DRY”(Don't Repeat Yourself)原则,旨在快速开发安全且可维护的网站。它提供了MVC(模型-视图-控制器)架构,内置ORM(对象关系映射)和强大的...

      PyPI 官网下载 | django_pumaska-1.0rc2-py3-none-any.whl

      标题中的“PyPI 官网下载 | django_pumaska-1.0rc2-py3-none-any.whl”指的是在Python的包索引服务(Python Package Index,简称PyPI)上发布的名为`django_pumaska`的软件包的1.0 release candidate 2版本。...

      Django1.0速查手册_Django 1.0 Cheat sheet

      此标题表明文档旨在为用户提供Django 1.0版本中的快速查询指南,帮助开发者更快地查阅并应用框架的功能。 #### 描述:Django 1.0 速查手册 描述部分简短重申了标题的内容,强调这是一份针对Django 1.0版本的速查...

      Django1.0以上版本的教材-DjangoBook2.0中文版.pdf

      4. **模版(第四章)** 模板系统是Django的一个重要组成部分,本章详细介绍了如何使用模板语言来构建动态页面,包括变量渲染、循环、条件判断等高级特性。 5. **模型(第五章)** Django的强大之处在于其内置的...

      django-classy-tags, 基于类的Django 模板标记.zip

      django-classy-tags, 基于类的Django 模板标记 django-classy-tags请参考文档/目录中的文档以获得帮助。 有关HTML呈现版本的信息,请参见这里的 。 这里项目这个项目的目标是创建一种新的编写 Django 模板标签的方法...

      分享:集成了Django1.0 的Google App Engine开发 模板项目

      1. **Django 1.0**:这是Django的一个旧版本,它引入了诸如数据库迁移、表单和模型的改进等特性。开发者需要了解Django的基本概念,如MVC(Model-View-Controller)架构、URL调度、模板系统、以及ORM(对象关系映射...

      Django 1.0.tar.gz

      这将会创建一个名为Django-1.0的目录,包含Django 1.0的所有源码和相关文件。你可以通过阅读源码、运行示例项目或自建项目来学习和理解Django的工作原理。 尽管Django 1.0相比最新的版本可能缺乏一些特性和改进,但...

    Global site tag (gtag.js) - Google Analytics