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

(一)关于Django

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

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

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

#先创建一个文件夹

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

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

#设置完之后,开启服务,便可进入后台管理界面了:http://127.0.0.1:8000/admin/

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

#创建一个用于投票的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

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

修改文件如下:

from django.db import models

# Create your models here.

from django.db import 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

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.contrib import admin

# Register your models here.

from django.contrib import admin

from polls.models import 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 创建用于视图的函数。

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

from django.shortcuts import render,get_object_or_404

# Create your views here.

from django.http import HttpResponse

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)

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

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

)

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

#正则表达式!!!!!

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

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

from django.conf.urls import patterns, include, url

from django.contrib import 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 两个文件。

{% 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)投票功能完善

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

#修改模板文件

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

#需要加入form表单

{{ poll.question }}

{% if error_message %}

{{ error_message }}

{% endif %}

{% csrf_token %}

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

{{ choice.choice_text }}

{% endfor %}

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

# 文件 polls/views.py

from django.shortcuts import get_object_or_404, render

from django.http import HttpResponseRedirect, HttpResponse

from django.core.urlresolvers import reverse

from 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(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 页。

def results(request, poll_id):

poll = get_object_or_404(Poll, pk=poll_id)

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

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

{{ poll.question }}

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

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

{% endfor %}

Vote again?

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是一个简单的 Django ORM 使用实例: 假设我们有一个简单的博客应用,其中包含两个模型:`Post` 和 `Comment`,`Post` 模型表示博客文章,`Comment` 模型表示博客文章下的评论。 首先,我们需要定义模型,可以在 `models.py` 文件中定义: ```python from django.db import models class Post(models.Model): title = models.CharField(max_length=200) content = models.TextField() created_at = models.DateTimeField(auto_now_add=True) class Comment(models.Model): post = models.ForeignKey(Post, on_delete=models.CASCADE) author = models.CharField(max_length=100) content = models.TextField() created_at = models.DateTimeField(auto_now_add=True) ``` 这里我们使用 `CharField`、`TextField` 和 `DateTimeField` 等字段类型来定义模型的字段。另外,`Comment` 模型使用了 `ForeignKey` 字段来关联 `Post` 模型。 接下来,我们可以使用 Django ORM 来操作这两个模型。例如,我们可以创建一篇博客文章: ```python from myapp.models import Post post = Post(title='Hello World', content='This is my first blog post.') post.save() ``` 这里我们首先从 `models` 模块导入 `Post` 模型,然后创建一个 `Post` 实例,设置标题和内容,并调用 `save()` 方法保存到数据库中。 我们也可以查询博客文章: ```python posts = Post.objects.all() for post in posts: print(post.title, post.content, post.created_at) ``` 这里我们使用 `objects` 属性获取 `Post` 模型的所有记录,并通过 `for` 循环遍历每个记录,并输出标题、内容和创建时间。 如果我们要查询某篇博客文章的评论,可以使用 `Comment` 模型的 `filter()` 方法: ```python from myapp.models import Comment comments = Comment.objects.filter(post_id=post.id) for comment in comments: print(comment.author, comment.content, comment.created_at) ``` 这里我们使用 `filter()` 方法来查询 `post_id` 等于当前博客文章的评论,并输出每个评论的作者、内容和创建时间。 以上就是一个简单的 Django ORM 使用实例。当然,在实际开发中,我们还可以使用更多的 ORM 方法来操作数据库,例如 `get()`、`create()`、`update()`、`delete()` 等方法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值