原文地址:http://www.cnblogs.com/djangochina/archive/2013/06/04/3114269.html

现在已经可以在后台管理投票了,现在就差怎么在前台显示和如何投票了
1、index:首先第一个要有首页,用来显示所有的投票
2、detail:详细信息页面,用来显示一个投票及相应的选项
3、results:结果页面,用来查看一个投票的结果
以及一个投票的操作

在polls/views.py 页面添加如下代码

from django.http import HttpResponse
def index(request):
return HttpResponse("Hello, world. You're at the poll index.")

打开polls/urls.py,设置如下url路由信息

from django.conf.urls import patterns, url
from polls import views
urlpatterns = patterns('',
url(r'^$', views.index, name='index')
)

打开项目下面的urls.py 即mysite/urls.py 用把poll应用下的url包含到主urls配置里面。

from django.conf.urls import patterns, include, url
from django.contrib import admin
admin.autodiscover()
urlpatterns = patterns('',
url(r'^polls/', include('polls.urls')),
url(r'^admin/', include(admin.site.urls)),
)

打开http://localhost:8000/polls/ 测试一下看看。

如果要想往views里面的方法传递参数要怎么做呢
看看下面的
修改poll/url.py

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'),
)

在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)

如果在浏览器输入http://localhost:8000/polls/34/,django是怎么处理的呢
1、在mysite/url.py中先找到匹配的 '^polls/'
2、把匹配的url去掉,把剩余 ”34/" 传递给poll下面的url.py
3、在poll/url.py中找到匹配的项 r'^(?P<poll_id>\d+)/$' 执行相应的view : detail()
在执行detail()的时候相当于

detail(request=<HttpRequest object>, poll_id='34')

那么这个34是如何对应到poll_id呢
在上面的第三步中,r'^(?P<poll_id>\d+)/$' 会把匹配出来的内容 34 和你们的正则组对应起来,poll_id对应匹配到的34

在上面写的index view仅仅是测试的,没有做具体的功能。

from django.http import HttpResponse
from polls.models import Poll
def index(request):
latest_poll_list = Poll.objects.order_by('-pub_date')[:5]
output = ', '.join([p.question for p in latest_poll_list])
return HttpResponse(output)

上面的意思是取最新的5个记录,以字符串的形式返回,并用“,”分开

模板

上面看到返回的内容的格式是直接写到index里面的,人们常用的要数据的逻辑处理和呈现分开就是这里的情况
这就用到django的模板功能了
建立文件: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 %}

现在再修改index函数

from django.http import HttpResponse
from django.template import Context, 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 = Context({
'latest_poll_list': latest_poll_list,
})
return HttpResponse(template.render(context))

大概意思就是 先加载一个模板,设置一个字典数据,再用render方法把模板中和字典对应的变量用字典中的值处理

因为django模板功能经常使用,所以提供了一种简化的代码写法。

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错误
这个错误我们很常见,当对应的页面不存在的时候就会出来

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})

这里还没有说到polls/detail.html模板,所以先在建立这个文件,简单的写入如下代码,先不让他出错

{{ poll }}

如果在poll中对应的poll_id不存在的话就引发404错误。

像这种情况会经常发生,所以django也提供了简单的写法

  1. from django.shortcuts import render, get_object_or_404
  2. # ...
  3. def detail(request, poll_id):
  4. poll = get_object_or_404(Poll, pk=poll_id)
  5. return render(request, 'polls/detail.html', {'poll': poll})

复制代码

如果是要处理多个对象需要用这个:

get_list_or_404()

get_object_or_404

是一样的功能,只是处理对象不同

如果发现错误了会在你的项目的url配置文件中找 handler404 对应的view来显示,如果找不到的话会用django自己的viewdjango.views.defaults.page_not_found()来显示,对于404文件也可以用模板来设置
在项目模板中 mysite/templates 中添加404.html django会自动找到这个模板,并且显示出来。

当然只有在DEBUG为false的情况下才会显示出现,否则会显示出一个具体的调试错误信息,可在settings.py文件里面设置

现在继续模板,修改polls/detail.html如下

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

{{ poll.question }} :django先以字典的形式在poll对象中查找question ,如果找不能以属性的方式来查找,因为在这个例子里question 就是poll的属性,所以在这里就找到了,如果还找不到的话就以列表索引的方式来查找。

poll.choice_set.all:这里其实执行的是poll.choice_set.all()方法,会返回 Choice 的迭代对象

  1. 模板中的url引用

复制代码

在上面代码中

<li><a href="/polls/{{ poll.id }}/">{{ poll.question }}</a></li>

里面的url连接是直接写在模板里面的,如果poll应用所在的位置改变了,就得需要在所有用到的模板里面都修改修改。所以django有一种简单的方法来实现。
还记得在poll/urls.py里设置的url吧。
没错,注意在设置url的时候最后面有个 name 属性,这个属性就是来给每个url一个名字,可以在模板里面直接用这个名字来代替url

<li><a href="{% url 'detail' poll.id %}">{{ poll.question }}</a></li>

注意:
如果设置{% url 'detail' poll.id %}不正常,而{% url detail poll.id %} 正常的话,说明你用的django版本<1.5,需要在模板的最上面添加:

{% load url from future %}

在poll.urls.py里面是如下的定义

  1. # the 'name' value as called by the {% url %} template tag
  2. url(r'^(?P<poll_id>\d+)/$', views.detail, name='detail'),

复制代码

如果以后想要在其他地方应用,或者不同的目录结果中,只需要更改此处就可以了,不用在每个模板里面更改,是不是很简单

# added the word 'specifics'
url(r'^specifics/(?P<poll_id>\d+)/$', views.detail, name='detail'),

url命名空间
假如现在有两个应用,每个应用下面的urls.py里面都有一个detail 定义的url,这个时候django就没法判断要用哪个了,所以就出来了个命名空间。用来区别不同的url

from django.conf.urls import patterns, include, url
from django.contrib import admin
admin.autodiscover()
urlpatterns = patterns('',
url(r'^polls/', include('polls.urls', namespace="polls")),
url(r'^admin/', include(admin.site.urls)),
)

再修改下模板文件

<li><a href="{% url 'detail' poll.id %}">{{ poll.question }}</a></li>

添加命名空间

<li><a href="{% url 'polls:detail' poll.id %}">{{ poll.question }}</a></li>

Django写的投票系统4(转)的更多相关文章

  1. Django写的投票系统2(转)

    在上一篇中 django实例:创建你的第一个应用投票系统(一) 已经介绍基本的功能,并已经启动服务了.这一节介绍数据库相关的东东. 首页打开mysite/settings.py配置文件, 设置数据库打 ...

  2. Django写的投票系统1(转)

    当然主要是从django的帮助文档里面来的,权当是翻译吧 这个投票系统的主要功能有 1.一个前台页面,可以让用户来投票 2.一个管理员页面,可以用来添加.修改.删除投票 首页第一步要确定你已经安装了D ...

  3. Django写的投票系统3(转)

    Django的管理面板默认是不开启的,所以我们需要进行一些设置工作1.在INSTALLED_APPS里面把 django.contrib.admin 前面的注释去掉2.运行 python manage ...

  4. Django快速开发投票系统

    使用Django搭建简单的投票系统:这个是官网的教程:https://docs.djangoproject.com/en/2.0/intro/tutorial01/ 在Run manage.py Ta ...

  5. 用django写个CMS系统

    上一篇介绍过django自带的flatpages,能够做简单的CMS.但是对于我们的真正的工作中的使用意义并不大.还是自己动手写一个吧. 不用说,一定是先从models开始的: from django ...

  6. Django快速开发之投票系统

    https://docs.djangoproject.com/en/1.8/intro/tutorial01/ 参考官网文档,创建投票系统. ================ Windows  7/1 ...

  7. django用户投票系统详解

    投票系统之详解 1.创建项目(mysite)与应用(polls) django-admin.py startproject mysite python manage.py startapp polls ...

  8. 利用django创建一个投票网站(五)

    创建你的第一个 Django 项目, 第五部分 这一篇从第四部分(en)结尾的地方继续讲起.我们在前几章成功的构建了一个在线投票应用,在这一部分里我们将其创建一些自动化测试. 自动化测试简介 自动化测 ...

  9. 利用django创建一个投票网站(二)

    创建你的第一个 Django 项目, 第二部分 这一篇从第一部分(zh)结尾的地方继续讲起.本节我们将继续写 Web 投票应用,并主要关注 Django 提供的自动生成的管理页面(admin site ...

随机推荐

  1. Boost::thread库的使用

    阅读对象 本文假设读者有几下Skills [1]在C++中至少使用过一种多线程开发库,有Mutex和Lock的概念. [2]熟悉C++开发,在开发工具中,能够编译.设置boost::thread库. ...

  2. 弹出框weeboxs 基本属性总结

    使用前需包含以下jquery.js.bgiframe.js.weebox.js文件 boxid: null, //设定了此值只后,以后在打开同样boxid的弹窗时,前一个将被自 动关闭 boxclas ...

  3. 【zigbee】开启及清除NV_RESTORE信息的方法

    1.NV_RESTORE宏的作用 问:coo和终端都已经组网成功 1.这时将coo断电,又一次上电,组网后终端的短地址是否不变? 2.这时终端断电,又一次上电,组网后终端的短地址是否不变? 3.这时C ...

  4. psl/sql本地与远程连接配置

    一:下载Oracleclient 下载地址:http://www.oracle.com/technetwork/database/features/instant-client/index-09748 ...

  5. Kendo UI开发教程(22): Kendo MVVM 数据绑定(十一) Value

    Value绑定可以把ViewModel的某个属性绑定到DOM元素或某个UI组件的Value属性.当用户修改DOM元素或UI组件的值时,绑定的ViewModel的值也随之发生改名.同样,如果ViewMo ...

  6. 两张图解读Java异常与断言

    两张图解读Java异常与断言                                 --转载请注明出处:coder-pig 本节引言: 前天公布的"七张图解析Java多线程&quo ...

  7. [置顶] ARM-Linux下WEB服务器Boa的移植、配置和运行测试

    Linux下使用的轻量级WEB服务器主要有:lighttpd.thttpd.shttpd和boa等等,而Boa是使用最为广泛的轻量级WEB服务器之一(当然,阿帕奇是世界使用排名第一的Web服务器软件) ...

  8. MSSQL - SQL Server2008附加数据库失败 错误号:5120

    附加数据库时,显示错误,错误信息为 一种解决方法为,设置mdf文件所在文件夹的权限(有些资料说只设置mdf文件的权限就好,但我试了不管用),在文件夹上右击——属性——安全,如图所示: 选择组或用户名中 ...

  9. Spring MVC Controller与jquery ajax请求处理json

    在用 spring mvc 写应用的时候发现jquery传递的[json数组对象]参数后台接收不到,多订单的处理,ajax请求: "}]}]} $.ajax({ url : url, typ ...

  10. linux命令行模式下实现代理上网(转)

    有些公司的局域网环境,例如我们公司的只允许使用代理上网,图形界面的很好解决就设置一下浏览器的代理就好了,但是linux纯命令行的界面就....下面简单几步就可以实现了! 一.命令行界面的一般代理设置方 ...