博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
frist Django app — 四、 完善View
阅读量:7184 次
发布时间:2019-06-29

本文共 3522 字,大约阅读时间需要 11 分钟。

上一篇已经完成了polls的基本功能,接下来完善剩下的vote功能和并使用generic views改进请求处理view。包含表单的简单运用和前后台参数传递。

目录

  • vote:完善投票功能
  • generic views:改进views.py

vote

编辑detail.html,添加投票投票功能

{
{question.question_text}}

{
% if error_message %}

{

{ error_message}}

{% endif %}
{
% csrf_token %} {
% for choice in question.choice_set.all %}
{
% endfor %}
  • 添加了form表单,使用post提交,提交到的地址是polls:vote代表一个地址,比如:http://127.0.0.1:8000/polls/4/vote/.
  • 这里涉及到了表单提交,添加{% csrf_token %}防止csrf攻击,原理就是每次使用的token不一致,导致无法进行伪造请求,从而防止。
  • forloop.counter是for循环的计数器。

编辑views.py添加投票功能,注意引入相关的类

def vote(request, question_id):    question = get_object_or_404(Question, pk=question_id)    try:        selected_choice = question.choice_set.get(pk=request.POST['choice'])    except (KeyError, Choice.DoesNotExist):        return render(request, 'polls/detail.html', {            'question': question,            'error_message':"you did`t select choice.",        })    else:        selected_choice.votes += 1        selected_choice.save()        return HttpResponseRedirect(reverse('polls:results', args=(question.id,)))
request.POST['choice']从post请求里面获取前台传递过来的参数,request.POST 是一个dictionary,键是参数名,值是参数值,档案如果是get请求的话就是request.GET return HttpResponseRedirect(reverse('polls:results', args=(question.id,)))在投票成功之后将页面进行了重定向,防止用户使用浏览器的回退功能之后重复提交表单 到现在为止功能已经完成了,可以进行测试了,启动服务器然后测试相关功能

generic views

对于很多web app来说,需要展示内容的方式相近,比如:查看某个列表,查看某一个的具体内容等等,为此Django提供了generic views——Django诠释了什么是快速便捷开发!

使用generic views改写views.py

from django.shortcuts import render, get_object_or_404from django.http import HttpResponse, Http404, HttpResponseRedirectfrom models import Question, Choicefrom django.views import genericfrom django.core.urlresolvers import reverse# Create your views here.class IndexView(generic.ListView):    template_name = 'polls/index.html'    context_object_name = 'latest_question_list'    def get_queryset(self):        return Question.objects.order_by('-publ_date')[:5]class DetailView(generic.DetailView):    model = Question    template_name = 'polls/detail.html'class ResultsView(generic.DetailView):    model = Question    template_name = 'polls/results.html'def vote(request, question_id):    question = get_object_or_404(Question, pk=question_id)    try:        selected_choice = question.choice_set.get(pk=request.POST['choice'])    except (KeyError, Choice.DoesNotExist):        return render(request, 'polls/detail.html', {            'question': question,            'error_message':"you did`t select choice.",        })    else:        selected_choice.votes += 1        selected_choice.save()        return HttpResponseRedirect(reverse('polls:results', args=(question.id,)))

我们将index,detail,result都改写了,使用到了ListView和DetailView。

IndexView复写了get_quesryset方法来实现我们自己的逻辑,设置了模板页面和返回的参数名称

DetailView设置了展示详细信息所需要的model和模板页面

既然使用了generic views就需要改写urls.py

from django.conf.urls import urlfrom . import viewsapp_name = 'polls'urlpatterns = [    url(r'^$', views.IndexView.as_view(), name = 'index'),    url(r'^(?P
[0-9]+)/detail/$', views.DetailView.as_view(), name = 'detail'), url(r'^(?P
[0-9]+)/results/$', views.ResultsView.as_view(), name = 'results'), url(r'^(?P
[0-9]+)/vote/$', views.vote, name = 'vote'),]

为了使用generic views把参数名称改为pk,因为在DetailView里面已经使用了该名称——这就是约定优于配置。

 

总结

整个程序基本写完了,我们回过头来发现,我们自己真正写了的代码真不多,基本都是依赖Django完成的。可见使用Django快速建站还是有道理的。

 


完整代码

转载于:https://www.cnblogs.com/sunshine-2015/p/5668399.html

你可能感兴趣的文章
『原创』用C++开发WM应用系列(4)——处理屏幕旋转
查看>>
理解C# Lazy<T>
查看>>
《Gundam Seed Destiny》启示录
查看>>
上传一份个人学习struts2的历程笔记
查看>>
Android常用秘籍总结
查看>>
simple-LDAP-auth / ldap_auth.php
查看>>
msdtc服务
查看>>
Ubuntu 12.04 中文输入法
查看>>
结构体中成员的引用
查看>>
DELPHI开发LINUX桌面程序
查看>>
Spring Core Programming(Spring核心编程) - AOP Concepts(AOP基本概念)
查看>>
转:[gevent源码分析] 深度分析gevent运行流程
查看>>
DNGuard HVM 2007 标准版更新[20070910]
查看>>
还没有读研,却已享受研究生“待遇”!!!
查看>>
最优秀的5个Linux文本编辑器
查看>>
数据库测试——实用技巧及测试方法
查看>>
JAVA与.NET的相互调用——TCP/IP相互调“.NET研究”用基本架构
查看>>
Windows & Linux服务器如何禁用ping总结
查看>>
关于Linux driver中device_create()使用的注意事项
查看>>
DirectUI的初步分析-转
查看>>