中山h5网站建设,天津网站建设技术托管,浙江建设厅继续教育网站首页,网站建设维护培训班一、概述用户请求到视图流程#xff1a;当有人访问我们django项目的时候 例如127.0.0.1:8000/polls/23#xff0c;django首先到加载mysite.urls模块在mysite.urls中发现有urlpatterns变量#xff0c;于是在其内按顺序进行匹配。当它匹配上了polls#xff0c;就到匹配到的po… 一、概述用户请求到视图流程当有人访问我们django项目的时候 例如127.0.0.1:8000/polls/23django首先到加载mysite.urls模块在mysite.urls中发现有urlpatterns变量于是在其内按顺序进行匹配。当它匹配上了polls就到匹配到的polls.urls中进行下一步处理在polls.url中又匹配到了/最终结果就是调用该模式对应的detail视图。mysite/urls.py文件polls/urls.py文件polls/views.py文件二、模板的命名空间1、首先在polls目录下创建一个新的templates目录Django会在它里面查找模板文件。项目settings.py文件中的 TEMPLATES配置项描述了 Django 如何载入和渲染模板。默认的设置文件设置了 DjangoTemplates 后端作为模板引擎并将 APP_DIRS设置成了 True。这一选项将会让 DjangoTemplates 在每个 INSTALLED_APPS 文件夹中寻找 templates 子目录。2、在templates中创建index文件3、修改视图文件polls/views.py让新的index.html文件生效并且如果请求的问卷ID不存在那么会弹出一个Http404错误。以上代码使用快捷方式get_object_or_404()就像render函数一样get_object_or_404()方法三、url Names命名空间当你有多个app的时候Django通过URL name来区分某个APP在polls/urls.py文件的开头部分添加一个app_name的变量来指定该应用的命名空间四、form表单1、修改polls/detail.html文件代码如下简要说明上面的模板显示一系列单选按钮按钮的值是选项的ID按钮的名字是字符串choice。这意味着当你选择了其中某个按钮并提交表单一个包含数据choice#的POST请求将被发送到指定的url#是被选择的选项的ID。这就是HTML表单的基本概念。form标签的action属性和method属性action表示你要发送的目的urlmethod表示提交数据的方式一般分post和get。forloop.counter是Django模板系统专门提供的一个变量用来表示你当前循环的次数一般用来给循环项目添加有序数标。由于我们发送了一个POST请求就必须考虑一个跨站请求伪造的安全问题简称CSRF。Django为你提供了一个简单的方法来避免这个困扰那就是在form表单内添加一条{% csrf_token %}标签标签名不可更改固定格式位置任意只要是在form表单内。这个方法对form表单的提交方式方便好使。2、修改polls/views.py文件中的vote函数简要说明request.POST是一个类似字典的对象允许你通过键名访问提交的数据。本例中request.POST[’choice’]返回被选择选项的ID并且值的类型永远是string字符串哪怕它看起来像数字同样的你也可以用类似的手段获取GET请求发送过来的数据一个道理。request.POST[’choice’]有可能触发一个KeyError异常如果你的POST数据里没有提供choice键值在这种情况下上面的代码会返回表单页面并给出错误提示。在选择计数器加一后返回的是一个HttpResponseRedirect而不是先前我们常用的HttpResponse。HttpResponseRedirect需要一个参数重定向的URL。这里有一个建议当你成功处理POST数据后应当保持一个良好的习惯始终返回一个HttpResponseRedirect。这不仅仅是对Django而言它是一个良好的WEB开发习惯。我们在上面HttpResponseRedirect的构造器中使用了一个reverse()函数。它能帮助我们避免在视图函数中硬编码URL。它首先需要一个我们在URLconf中指定的name然后是传递的数据。例如/polls/3/results/其中的3是某个question.id的值。重定向后将进入polls:results对应的视图并将question.id传递给它。白话来讲就是把活扔给另外一个路由对应的视图去干。当有人对某个问题投票后vote()视图重定向到了问卷的结果显示页面。下面我们来写这个处理结果页面的视图函数detail函数(polls/views.py)还需要写个模板polls/templates/polls/results.html。(路由、视图、模板、模型都是这个套路....)五、使用通用视图减少代码量将原来的代码改为通用视图的方法修改URLconf设置删除一些旧的无用的视图采用基于类视图的新视图1、修改URLconf2、修改视图在这里我们使用了两种通用视图ListView和DetailView(它们是作为父类被继承的)。这两者分别代表“显示一个对象的列表”和“显示特定类型对象的详细页面”的抽象概念。每一种通用视图都需要知道它要作用在哪个模型上这通过model属性提供。DetailView需要从url捕获到的称为pk的主键值因此我们在url文件中将2和3条目的修改成了。默认情况下DetailView通用视图使用一个称作/_detail.html的模板。在本例中实际使用的是polls/detail.html。template_name属性就是用来指定这个模板名的用于代替自动生成的默认模板名。(一定要仔细观察上面的代码对号入座注意细节。)同样的在results列表视图中指定template_name为polls/results.html这样就确保了虽然resulst视图和detail视图同样继承了DetailView类使用了同样的modelQeustion但它们依然会显示不同的页面。(模板不同嘛so easy)类似的ListView通用视图使用一个默认模板称为/_list.html。我们也使用template_name这个变量来告诉ListView使用我们已经存在的 polls/index.html模板而不是使用它自己默认的那个。在教程的前面部分我们给模板提供了一个包含question和latest_question_list的上下文变量。而对于DetailViewquestion变量会被自动提供因为我们使用了Django的模型(Question)Django会智能的选择合适的上下文变量。然而对于ListView自动生成的上下文变量是question_list。为了覆盖它我们提供了context_object_name属性指定说我们希望使用latest_question_list而不是question_list。