对detail.html 页面进行值的传递
- 首先创建一个*<form action="{% url 'blog:vote' question.id }" method='post'> *标签,用来把得到表单数据post给server后端服务.其中的url 'blog:vote' 代表urls.py中相应的url. 对应的可以映射到views中相应的方法
- 使用radio属性的input 构造一个多选选择框, 其中的forloop.counter方法为返回当前循环的次数(相当于一个计时器).
forloop.counter
indicates how many times the for tag has gone through its loop
-
{% csrf_token %} 这个方法加在页面里.主要是用来防止跨站
Since we’re creating a POST form (which can have the effect of modifying data), we need to worry about Cross Site Request Forgeries. Thankfully, you don’t have to worry too hard, because Django comes with a very easy-to-use system for protecting against it. In short, all POST forms that are targeted at internal URLs should use the {% csrf_token %}
在views.py中编写vote方法,构造投票逻辑
- 利用request把POST表单中的choice的值返回.利用question对象,通过外键查找到相应的choice对象.
获取到selected_choice 对象后对choice的votes字段的值进行+1操作。表示进行了投票。使用save()
保存到数据库的choice表中
1.request.POST 是一个页面传递表单参数的方法.相当于一个字典,对key进行values的获取.values始终是strings
django还提供了request.GET方法用于获取传递的参数
2.HttpResponseRedirect()方法:用于进行重定向.
其中有reverse()这个方法.这个方法避免了对url的拼接构造.直接在参数中放入templates中的页面地址跟相应跳转的args即可.
在views.py中编写result方法.对投票后的结果进行显示.较为简单,进行question的传递即可
编写result的html页面
- 对数据库传递过来的值进行展示
其实现在这个版本的 投票系统有问题.当多人访问时.会产生竞争条件问题(race condition). - 另外,pluralize这个东西好像是管道命令(过滤器?).http://blog.csdn.net/foryouslgme/article/details/52057445 有详细介绍
使用形式:{{value | pluralize}},或者{{value | pluralize:”es”}},或者{{value | pluralize:”y,ies”}}
意义:如果value不是1,则返回一个复数后缀,缺省的后缀是’s’