Django入门笔记【四】

入门笔记翻译整理自:https://docs.djangoproject.com/en/1.8/

*该笔记将使用一个关于投票网络应用(poll application)的例子来阐述Django的用法。

表单和通用视图(Forms&Generic Views)

1. 简单的表单

修改detail.html中的代码,使之含有<form>元素:

 1 # polls/templates/polls/detail.html
 2
 3 <h1>{{ question.question_text }}</h1>
 4
 5 {% if error_message %}<p><strong>{{ error_message }}</strong></p>{% endif %}
 6
 7 <form action="{%url ‘polls:vote‘ question.id %}" method="post">
 8 {% csrf_token %}
 9 {% for choice in question.choice_set.all %}
10     <input type="radio" name="choice" id="choice{{ forloop.counter }}" value="{{choice.id }}" />
11     <label for="choice{{ forloop.counter }}">{{ choice.choice_text }}</label><br />
12 {% endfor %}
13 <input type="submit" value="Vote" />
14 </form>

以上代码:首先,为选项生成了radio按钮;其次,当你创建数据服务端(data server-side)的表单时,要始终使用method="post";然后,forloop.counter对循环进行计数;最后,由于使用了POST方法,我们需要关心跨站请求伪造(Cross Site Request Forgeries),不过Django提供了对此的保护机制。

我们在入门基础【三】中创建了如下代码:

1 # polls/urls.py
2
3 url(r‘^(?P<question_id>[0-9]+/vote/$‘, views.vote, name=‘vote‘),

向polls/views.py中添加如下代码:

 1 # polls/views.py
 2
 3 from django.shortcuts import get_object_or_404, render
 4 from django.http import HttpResponseRedirect, HttpResponse
 5 from django.core.urlresolvers import reverse
 6
 7 from .models import Choice, Question
 8 # ...
 9 def vote(request, question_id):
10     p = get_object_or_404(Question, pk=question_id)
11     try:
12         selected_choice = p.choice_set.get(pk=request.POST[‘choice‘])
13     except (KeyError, Choice.DoesNotExist):
14         # Redisplay the question voting form.
15         return render(request, ‘polls/detail.html‘,{
16             ‘question‘: p,
17             ‘‘error_message‘: "You didn‘t select a choice.",
18     })
19     else:
20         selected_choice.vote += 1
21         selected_choice.save()
22         # Always return an HttpResponseRedirect after successfully dealing
23         # with POST data. This prevents data from being posted twice if a
24         # user hits the Back button.
25         return HttpResponseRedirect(reverse(‘polls:results‘, args=(p.id,)))

当有人在问题下投票后,vote()视图会重新定向至结果页面,该页面视图如下:

1 # polls/views.py
2
3 from django.shortcuts import get_object_or_404, render
4
5 def results(request, question_id):
6     question = get_object_or_404(Question, pk=question_id)
7     return render(request, ‘polls/results.html‘, {‘question‘: question})

现在,创建polls/results.html模板:

 1 # polls/templates/polls/results.html
 2
 3 <h1>{{ question.question_text }}</h1>
 4
 5 <ul>
 6 {% for choice in question.choice_set.all %}
 7     <li>{{ choice.choice_text }} -- {{ choice.votes }} vote {{ choice.votes | pluralize }}</li>
 8 {% endfor %}
 9 </ul>
10
11 <a href="{% url ‘polls:detail‘ question.id %}">Vote again?</a>

2. 使用通用视图

注意到,detail()和results()视图很简单,并且冗余。index()视图也很相似。

这些视图代表了一种常见情形:根据URL中的被传递参数,从数据库中获取数据,载入模板,返回渲染后的模板。对于此类情形,可以使用Django提供的通用视图系统。

为了使用通用视图进行代码简化,我们需要进行以下改变:

1.转换URLconf;2.删除陈旧不必要的视图;3.引入基于通用视图的新视图

3. 修改URLconf

 1 # polls/urls.py
 2
 3 from django.conf.urls import url
 4
 5 from . import views
 6
 7 ulrpatterns = [
 8     url(r‘^$‘, views.IndexView.as_view(), name=‘index‘),
 9     url(r‘^(?P<pk>[0-9]+)/$‘, views.DetailView.as_view(), name=‘detail‘),
10     url(r‘^(?P<pk>[0-9]+)/results/$‘, views.ResultsView.as_view(), name=‘results‘),
11     url(r‘^(?P<question_id>[0-9]+)/vote/$‘, views.vote, name=‘vote‘),
12 ]

注意第二和第三个模式从question_id变成了pk。

4. 修改Views

 1 # polls/views.py
 2
 3 from django.shortcuts import get_object_or_404, render
 4 from django.http import HttpResponseRedirect
 5 from django.core.urlresolvers import reverse
 6 from django.views import generic
 7
 8 from .models import Choice, Question
 9
10 class IndexView(generic.ListView):
11     template_name = ‘polls/index.html‘
12     context_object_name = ‘latest_question_list‘
13
14     def get_queryset(self):
15         """Return the last five published questions."""
16         return Question.objects.order_by(‘-pub_date‘)[:5]
17
18 class DetailView(generic.DetailView):
19     model = Question
20     template_name = ‘polls/detail.html‘
21
22 class ResultsView(generic.DetailView):
23     model = Question
24     template_name = ‘polls/results.html‘
25
26 def vote(request, question_id):
27     ... # same as above

-- The End --

时间: 2024-08-03 01:22:15

Django入门笔记【四】的相关文章

Django入门笔记

Django入门笔记 **文档包含Django安装包.学习的笔记.代码等 安装 Django参考附件,只需要把附件拷贝到你需要的目录就行.Django是1.8.16版本 Python:在附件中,其中有Django需要的依赖包 编辑器:Aptana,一个强大的IDE工具,可以在上边新建模板,支持各种语言 Django项目创建 **可以用附件中的工程目录或者自己新建 新建工程-创建Django 新建工程-配置Django工程 工程创建完成后,会在工程目录中自动创建以下几个py文件 settings.

Django入门笔记【三】

入门笔记翻译整理自:https://docs.djangoproject.com/en/1.8/ *该笔记将使用一个关于投票网络应用(poll application)的例子来阐述Django的用法. Public interface - views. 1. 定义 视图(View)是Django应用中用于实现某一特定功能的Web页面.比如,一个博客可以有博客展示页面,博客创建页面,评论页面. 2. 视图示例 写入代码 1 #polls/views.py 2 3 from django.http

Django入门笔记【一】

入门笔记翻译整理自:https://docs.djangoproject.com/en/1.8/ *该笔记将使用一个关于投票网络应用(poll application)的例子来阐述Django的用法. 1. 查看Django是否安装及版本 1 $ python -c "import django; print(django.get_version())" 2. 创建一个项目(project) 通过cd方式进入自创目录,然后运行: 1 $ django-admin startprojec

Django入门笔记【二】

入门笔记翻译整理自:https://docs.djangoproject.com/en/1.8/ *该笔记将使用一个关于投票网络应用(poll application)的例子来阐述Django的用法. 1. 创建管理员(admin user) 运行代码 1 $ python manage.py createsuperuser 2 3 Username: admin 4 Email address: [email protected] 5 6 Password: ********* 7 Passw

Django入门笔记【六】

入门笔记翻译整理自:https://docs.djangoproject.com/en/1.8/ *该笔记将使用一个关于投票网络应用(poll application)的例子来阐述Django的用法. *静态文件(static files):images, JavaScript, CSS 1. 自定义应用外观(look and feel) 创建polls/static目录.Django的STATICFILES_FINDERS会寻找静态文件.在static目录下,创建polls/style.css

flask快速入门笔记四_模板:分离数据与视图

首先声明:内容大部分来自huizhiwang,只是单纯记笔记. 1 模板引擎 在Flask中,视图函数的返回值为响应的正文被送往前端浏览器.毫无疑问,一个实用 的视图函数需要在服务端根据请求的不同动态构造这个内容.然而手工拼接一段冗长 的HTML串是乏味而且相当容易出错. 这正是模板引擎发挥威力的地方,只需要将模板和数据送入模板引擎,我们就告 别了那些那些拼接.转义之类的琐碎之事,轻松得到一个渲染后的字符串:

OpenGLES入门笔记四

一.编译Vertex Shaders和Fragment Shaders 目前为止,xcode仅仅会把这个两个文件(simple.vertsh和simple.fragsh)copy到application bundle中.我们还需要在运行编译和运行这些Shaders. 你会很诧异,为什么要在app运行时编译代码? 这样做的好处是:我们的Shaders不用依赖于某种图形芯片(这样可以跨平台嘛). 下面开始加入动态编译的代码(两种方式.1.直接在OpenGLView写入:2.创建工具类) 我选用第二种

python学习笔记--Django入门四 管理站点

上一节  Django入门三 Django 与数据库的交互:数据建模 "管理员界面"是基础功能中的重要部分.. 激活管理员界面 管理界面是 Django 中最酷的一部分.但是不是所有人都需要它,所以它是可选的.这也就意味着你需要跟着三个步骤来激活它. 在你的 models 中加入admin metadata. 不是所有的models都能够(或应该)被管理员编辑,你需要给models标记一个管理员接口(interface),通过给models添加一个内部类'admin'完成接口标记.所以

Django学习笔记(四)—— Admin

疯狂的暑假学习之  Django学习笔记(四)-- Admin 参考:<The Django Book> 第6章 Django 可以使用admin自动创建管理界面. 1. 配置 django-admin.py startproject 创建的项目,如果没有注解掉默认的配置,python manage.py syncdb 创建用户后,直接 http://xxxxxx/admin 输入密码即可进入. 如果修改了配置文件,保证将 django.contrib.admin 加入setting.py 中