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 %}
{% 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了。
本文原创发布php中文网,转载请注明出处,感谢您的尊重!
相关文章
相关视频
网友评论
文明上网理性发言,请遵守 新闻评论服务协议我要评论
立即提交
专题推荐独孤九贱-php全栈开发教程
全栈 100W+
主讲:Peter-Zhu 轻松幽默、简短易学,非常适合PHP学习入门
玉女心经-web前端开发教程
入门 50W+
主讲:灭绝师太 由浅入深、明快简洁,非常适合前端学习入门
天龙八部-实战开发教程
实战 80W+
主讲:西门大官人 思路清晰、严谨规范,适合有一定web编程基础学习
php中文网:公益在线php培训,帮助PHP学习者快速成长!
Copyright 2014-2020 https://www.php.cn/ All Rights Reserved | 苏ICP备2020058653号-1