用python做一个简单的投票程序_以一个投票程序的实例来讲解Python的Django框架使...

(一)关于Django

Django是一个基于MVC构造的框架。但是在Django中,控制器接受用户输入的部分由框架自行处理,所以 Django 里更关注的是模型(Model)、模板(Template)和视图(Views),称为 MTV模式。

Ubuntu下的安装:一般都自带Python的。网上教程比较多了....

1

2

3

4

5

6

7

8

dizzy@dizzy-pc:~$ python

Python 2.7.3 (default, Apr 20 2012, 22:44:07)

[GCC 4.6.3] on linux2

Type"help","copyright","credits" or"license" for more information.

>>>import django

>>> help(django)

VERSION = (1, 6, 4,'final', 0)

#可以查看django版本等信息。

(二)第一个Django的app

#环境:Python2.7,Django1.6,Ubuntu12.04

Python 及 Django 安装成功之后,就可以创建Django工程了

(1)教你开始写Django1.6的第1个app

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

#先创建一个文件夹

dizzy@dizzy-pc:~$mkdir Python

dizzy@dizzy-pc:~$cd Python

#然后创建工程

dizzy@dizzy-pc:~/Python$ django-admin.py startproject mysite

dizzy@dizzy-pc:~/Python$cd mysite

#然后这个工程就可以启动服务了

dizzy@dizzy-pc:~/Python/mysite$ python manage.py runserver

Validating models...

0 errors found

July 23, 2014 - 14:17:29

Django version 1.6.4, using settings'mysite.settings'

Starting development server at http://127.0.0.1:8000/

Quit the server with CONTROL-C.

#这样,打开浏览器访问: 便可看到: It Worked! 关闭服务:ctrl+c

#新创建的项目里面会有:manage.py文件,mysite文件夹

#在mysite文件夹里面会有:__init__.py,settings.py,urls.py,wsgi.py四个文件

#__init__.py是一个空文件,

#setting.py 是项目的配置文件。需要修改两个地方,这里使用默认的SQLite3数据库

LANGUAGE_CODE ='zh-cn' #原:en-us

TIME_ZONE ='Asia/Shanghai' #原:UTC

#配置完之后,便可以创建数据表了

dizzy@dizzy-pc:~/Python/mysite$ python manage.py syncdb

#创建是还要设置一个超级管理员,用于后台登录。

(2)教你开始写Django1.6的第1个app

1

2

3

4

5

6

7

#创建一个用于投票的app。

#进入mysite工程根目录,创建app

dizzy@dizzy-pc:~/Python/mysite$ python manage.py startapp polls

dizzy@dizzy-pc:~/Python/mysite$ls polls

admin.py __init__.py models.py urls.py views.py

#这样。Django已经生成了,app通常所需的模板文件。

下面创建两个models。Poll 和 Choice

1

dizzy@dizzy-pc:~/Python/mysite$ vim polls/models.py

修改文件如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

from django.dbimport models

# Create your models here.

from django.dbimport models

class Poll(models.Model):

question= models.CharField(max_length=200)

pub_date= models.DateTimeField('date published')

class Choice(models.Model):

poll= models.ForeignKey(Poll)

choice_text= models.CharField(max_length=200)

votes= models.IntegerField(default=0)

#基本创建model过程就是这样,细节还要深入研究!

然后修改工程的配置文件setting.py,在INSTALLED_APP元组下面添加刚才创建的app:polls

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

dizzy@dizzy-pc:~/Python/mysite$ vim mysite/settings.py

INSTALLED_APPS= (

'django.contrib.admin',

'django.contrib.auth',

'django.contrib.contenttypes',

'django.contrib.sessions',

'django.contrib.messages',

'django.contrib.staticfiles',

'polls',

)

#可以使用 python manage.py sql polls 查看app的建表SQL

#使用 python manage.py syncdb 进行创建数据库表

dizzy@dizzy-pc:~/Python/mysite$ ./manage.py sql polls

BEGIN;

CREATE TABLE"polls_poll" (

"id" integer NOT NULL PRIMARY KEY,

"question" varchar(200) NOT NULL,

"pub_date" datetime NOT NULL

)

;

CREATE TABLE"polls_choice" (

"id" integer NOT NULL PRIMARY KEY,

"poll_id" integer NOT NULL REFERENCES"polls_poll" ("id"),

"choice_text" varchar(200) NOT NULL,

"votes" integer NOT NULL

)

;

COMMIT;

#这样就可以通过设置model让Django自动创建数据库表了

要想在后台admin中管理polls。还需要修改app下面的admin.py 文件。

from django.contribimport admin

# Register your models here.

from django.contribimport admin

from polls.modelsimport Choice,Poll

class ChoiceInLine(admin.StackedInline):

model= Choice

extra= 3

class PollAdmin(admin.ModelAdmin):

fieldsets= [

(None, {'fields':['question']}),

('Date information', {'fields':['pub_date'],'classes':['collapse']}),

]

inlines= [ChoiceInLine]

admin.site.register(Poll,PollAdmin)

#这部分代码,大体能看懂,具体的规则还要稍后的仔细研究。

##这部分代码,由于拼写失误,导致多处出错。细节决定成败!!

这样再重启服务,就能在后台管理polls应用了。

(3)视图和控制器部分

前面已经完成了model(M)的设置。剩下的只有view(V)和urls(C)了。Django的视图部分,由views.py 和 templates完成。

在polls中,我们将创建4个视图:

“index” 列表页 – 显示最新投票。

“detail” 投票页 – 显示一个投票的问题, 以及用户可用于投票的表单。

“results” 结果页 – 显示一个投票的结果。

投票处理 – 对用户提交一个投票表单后的处理。

现在修改 views.py 创建用于视图的函数。

1

dizzy@dizzy-pc:~/Python/mysite$ vim polls/views.py

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

from django.shortcutsimport render,get_object_or_404

# Create your views here.

from django.httpimport HttpResponse

from polls.modelsimport 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)

def detail(request,poll_id):

poll= get_object_or_404(Poll,pk=poll_id)

return render(request,'polls/detail.html',{'poll':poll})

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)

#涉及Django的自带函数,不做深究。后面再做研究!

要想使试图能被访问,还要配置 urls.py 。mysite是整个网站的URLConf,但每个app可以有自己的URLConf,通过include的方式导入到根配置中即可。现在在polls下面新建 urls.py

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

from django.conf.urlsimport patterns,url

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

)

#url中,三个参数。正则的url,处理的函数,以及名称

#正则表达式!!!!!

然后在根 urls.py 文件中,include这个文件即可。

1

dizzy@dizzy-pc:~/Python/mysite$ vim mysite/urls.py

1

2

3

4

5

6

7

8

9

10

11

12

13

14

from django.conf.urlsimport patterns, include, url

from django.contribimport admin

admin.autodiscover()

urlpatterns= patterns('',

# Examples:

# url(r'^$', 'mysite.views.home', name='home'),

# url(r'^blog/', include('blog.urls')),

url(r'^polls/', include('polls.urls',namespace="polls")),

url(r'^admin/', include(admin.site.urls)),

)

#有Example:两种形式。因为是元组,所以开始有“ ‘', ”。

然后开始创建模板文件。在polls下,创建templates文件夹。下面有index.html, detail.html 两个文件。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

{% if latest_poll_list %}

{% for poll in latest_poll_list %}

{{ poll.question }}

{% endfor %}

{% else %}

No polls are available.

{% endif %}

{{ poll.question }}

{% for choice in poll.choice_set.all %}

{{ choice.choice_text }}

{% endfor %}

(4)投票功能完善

上面只是简单的实现了视图功能,并没有真正的实现投票功能。接下来就是完善功能。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

#修改模板文件

dizzy@dizzy-pc:~/Python/mysite$ vim polls/templates/polls/detail.html

#需要加入form表单

{{ poll.question }}

{% if error_message%}

{{ error_message }}

{% endif%}

{% csrf_token%}

{% for choicein poll.choice_set.all %}

{{ choice.choice_text }}

{% endfor%}

然后需要修改 views.py 中的 vote 处理函数。进行post数据的接收与处理。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

# 文件 polls/views.py

from django.shortcutsimport get_object_or_404, render

from django.httpimport HttpResponseRedirect, HttpResponse

from django.core.urlresolversimport reverse

from polls.modelsimport 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(request,'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('polls:results', args=(p.id,)))

在投票成功之后,让用户浏览器重定向到结果 results.html 页。

1

2

3

def results(request, poll_id):

poll= get_object_or_404(Poll, pk=poll_id)

return render(request,'polls/results.html', {'poll': poll})

然后就需要创建模板 results.html 。

1

2

3

4

5

6

7

8

9

10

11

{{ poll.question }}

{% for choice in poll.choice_set.all %}

{{ choice.choice_text }} -- {{ choice.votes }} vote{{ choice.votes|pluralize }}

{% endfor %}

Vote again?

至此,重启服务就能看到单选按钮,以及submit了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/435289.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

做点什么吧

写了6年代码了,回头发现,虽然写了那么多,真正在使用的少的可怜,真正意义上创造性的劳动也少的可怜。大部分时间都在重复着CtrlC和CtrlV,感觉和产线上的工人差不了多少? 总得做点什么吧? 留下点什么&#x…

BSS段、数据段、代码段、堆与栈

BSS段:BSS段(bss segment)通常是指用来存放程序中未初始化的全局变量的一块内存区域。BSS是英文Block Started by Symbol的简称。BSS段属于静态内存分配。 数据段:数据段(data segment)通常是指用来存放程序…

python安装模块方法_Python安装模块的几种方法

一、方法1: 单文件模块 直接把文件拷贝到 $python_dir/Lib 二、方法2: 多文件模块,带setup.py 下载模块包,进行解压,进入模块文件夹,执行: python setup.py install 三、 方法3:easy…

使用参数来防止SQL注入

SQL注入的威力是不可忽视的,下面我们主要介绍防范方法——使用参数化SQL。对于不同的数据供应器都有对就的 Parameter 来表示SQL语句或者存储过程中的各种参数。参数和数据库字段的真实类型——对应,所有参数的值会仅仅被认为一个参数。因此,…

高通qca9565网卡驱动_修改注册表让Surface Go的无线网卡支持频段选择

我的Surface Go是第一代无LTE版本,无线网卡型号是Qualcomm Atheros QCA61x4A,因为一些原因急需优先选择5GHz频段wifi的功能,因此写下本文。本文的解决方案仅能保证对Qualcomm Atheros QCA61x4A这一型号的网卡有效,对于其他同品牌不…

异或运算^和他的一个常用作用

发现一个新知识,介绍给大家: 二进制异或运算:两者相等为0,不等为1. 这样我们发现交换两个整数的值时可以不用第三个参数。 如a11,b9.以下是二进制 aa^b1011^10010010; bb^a1001^00101011; aa^b0010^10111001; 这样一来a9,b11了。 举一个运…

微服务 前台调用后台的慢的原因_20年IT农民工分享SpringCloud微服务架构实战文档...

前言越来越多的企业使用 SpringCloud 实现微服务架构设计。我们可以看到这样一种现象:不管是全新开发,还是系统重构,大家似乎都在争先恐后地使用微服务。对于一个Java开发人员来说,学习微服务相关知识大有裨益。本文将从架构设计、…

流量专家为114搜索提供权威流量访问统计

一:系统介绍互联网流量实时统计产品是一套网站流量统计分析系统。致力于为所有网站、第三方统计等用户提供网站流量监控、统计、分析等专业服务。 通过互联网流量实时统计产品 ,站长可以随时知道自己网站的被访问情况,每天多少人看了哪些网页…

神经网络与深度学习——TensorFlow2.0实战(笔记)(二)(Anaconda软件介绍)

Anaconda软件介绍 Anaconda下载与安装(安装之后会有详细步骤) 下载地址: Anaconda官网 https://www.anaconda.com/distribution/ 清华大学软件镜像站 https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/ 软件界面及界面功能介绍 界…

wince 自带的web server

同arm linux相比,wince的网络功能用的相对较少.实际上,wince的网络功能并不逊色,比如"remote display control"就能通过网络远程控制终端. wince自带的web server也是功能强大,绝非arm linux上轻量级的boa之类可比(当然arm linux上有很多其他选择).PB工程加上web se…

Wince6.0p上用ASP技术实现Webserver

一 环境的搭建 1. 内核定制时选上vbscript、javascript,wince6.0自到的web服务器就可以解析vbscript、javascript脚本语言。 2. 数据库的安装 项目中使用的是SQLce3.5数据库,它的安装文件随vs2008一起发布,安装文件有三个:sqlce.w…

opengles 3.0游戏开发_开发者们,快来测试Android Q啦!

近日,谷歌正式推出Android Q Beta 1版本及预览版SDK,TestBird已部署到测试机型,开发者们可到TestBird测试平台测试。此次Android Q 做了不少改进,不少尝鲜的用户反映Android Q对全面屏的手势操作更加友好,整体使用体验…

神经网络与深度学习——TensorFlow2.0实战(笔记)(二)(Anaconda软件使用)

Python的运行模式 交互模式 打开命令行窗口 键入 python,激活python交互模式,出现Python提示符 >>> 在提示符 >>> 处, 写入Python语句 回车,得到Python语句的执行结果 退出Python交互模式 在Python命令提示符后&#…

Ubuntu10.04No init found. Try passing init= bootarg解决方案

在正常状态下误敲 fsck 命令后,果断悲剧。屏幕错误提示错误显示类似于:mount: mounting /dev/disk/by-uuid/***************************** on /rootfailed: Invalid argumentmount: mounting /sys on /root/sys failed: No such file or directorymount…

greenfoot推箱子游戏_推箱子小游戏V2.0更新

小游戏实践推箱子V2.0大家好,我是努力学习争取成为优秀的Game Producer的路人猿,我们上期一起学习制作推箱子的简易V1.0版本,学习了如何响应用户的输入以及面对箱子的各种情况,今天我们把这个程序完善,制作V2.0~ 接着上…

ASP+COM技术在嵌入式Webserver中的应用

1 .COM组件介绍 COM(Component Object Model),即组件对象模型,它是微软公司开发的一种新的软 件开发技术,Microsoft 的许多技术,如 ActiveX、DirectX、以及 OLE 等都是基于 COM 而建立起来的。COM 标准包括规范和实现两大部分&…

神经网络与深度学习——TensorFlow2.0实战(笔记)(二)(包管理和环境管理)

包管理和环境管理(以下操作也可在anaconda界面&#xff0c;进行可视化操作) 包管理&#xff1a;包的安装、卸载、更新和查找等等 conda命令 conda install <包名称列表> 同时安装多个包 conda install numpy scipy 指定安装的版本(&#xff0c;均可) conda instal…

双向(端)链表、栈、队列

双端链表 双端栈 双端队列 从实用角度,感受不出双端队列的好处,但其可以充当栈和队列的角色. 参考资料:http://baike.baidu.com/view/1627726.htm Test static void Main() {var deque new Deque<int>();Console.WriteLine("Stack:");//stackdeque.AddFirst(1…

wince6.0开机自启动应用程序

1、在VS2005下建立一个Win32智能设备项目&#xff0c;取名为ShellExe&#xff0c;编译如下代码&#xff1a; int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow) { WIN32_FIND_DATA fd; HANDLE hdINVALID_HANDLE_VAL…

python语言单行注释符_云计算开发学习笔记:Python3注释

大家在学习各种编程语言的时候都会在代码里面添加一些注释&#xff0c;这个也是为了方便日后对代码的查找和修改&#xff0c;各种编程语言的注释方式略有不同&#xff0c;Python3语言也一样有自己的注释方式&#xff0c;下面我们来了解一下都有哪几种。 确保对模块&#xff0c;…