云南省住房与城乡建设厅网站,太原网站建设费用,外贸网站测速,ru域名注册视图 视图 - 是具体的业务代码 在 app 下的 views.py 文件中编写代码
from django.http import HttpResponsedef index(request):return HttpResponse(这里是我的站点)为了调用该视图#xff0c;我们还需要编写urlconf#xff0c;也就是路由配置。在polls目录中…视图 视图 - 是具体的业务代码 在 app 下的 views.py 文件中编写代码
from django.http import HttpResponsedef index(request):return HttpResponse(这里是我的站点)为了调用该视图我们还需要编写urlconf也就是路由配置。在polls目录中新建一个文件名字为urls.py不要换成别的名字在其中输入代码如下:
from django.urls import path
from . import views
urlpatterns [path(, views.index, nameindex),
]接下来在项目的主urls.py文件中添加urlpattern条目指向我们刚才建立的polls这个app独有的urls.py文件这里需要导入include模块。打开mysite/urls.py文件代码如下
from django.contrib import admin
from django.urls import include, pathurlpatterns [path(polls/, include(polls.urls)),path(admin/, admin.site.urls),
]include语法相当于多级路由它把接收到的url地址去除与此项匹配的部分将剩下的字符串传递给下一级路由 urlconf 进行判断。 include的背后是一种即插即用的思想。项目的根路由不关心具体app的路由策略只管往指定的二级路由转发实现了应用解耦。app所属的二级路由可以根据自己的需要随意编写不会和其它的app路由发生冲突。app目录可以放置在任何位置而不用修改路由。这是软件设计里很常见的一种模式。 建议除了admin路由外尽量给每个app设计自己独立的二级路由。 路由设置成功后启动服务器然后在浏览器中访问地址 http://localhost:8000/polls/。 模板
Django 中的视图的概念是一类具有相同功能和模板的网页的集合。一个视图通常对应一个页面提供特定的功能使用特定的模板。 在Django中网页和其它的一些内容都是通过视图来处理的。视图其实就是一个简单的Python函数在基于类的视图中称为方法。Django通过对比请求的URL地址来选择对应的视图也就是路由。 为了将 URL 和视图关联起来Django 使用 URLconfs来配置路由。
urlpatterns [path(, views.index, nameindex),path(int:question_id/, views.detail, namedetail),path(int:question_id/results/, views.results, nameresults),path(int:question_id/vote/, views.vote, namevote),]“int:question_id/”, 这里面不能包含空格 项目settings.py文件中的 TEMPLATES配置项描述了 Django 如何载入和渲染模板。默认的设置文件设置了 DjangoTemplates 后端作为模板引擎并将 APP_DIRS设置成了 True。这一选项将会让 DjangoTemplates 在每个 INSTALLED_APPS 文件夹中寻找 “templates” 子目录。 在templates目录下建立一个与app同名的子目录将该app所属的模板都放到里面从而达到独立命名空间的作用不会出现引用错误。
返回模板的两种方法
from django.http import HttpResponse
from django.template import loader
from .models import Questiondef index(request):latest_question_list Question.objects.order_by(-pub_date)[:5]template loader.get_template(polls/index.html)context {latest_question_list: latest_question_list,}return HttpResponse(template.render(context, request))from django.shortcuts import render
from .models import Questiondef index(request):latest_question_list Question.objects.order_by(-pub_date)[:5]context {latest_question_list: latest_question_list}return render(request, polls/index.html, context)注意此处不再需要导入 loader而是从django.shortcuts导入了render。 render()函数的第一个位置参数是请求对象就是view函数的第一个参数这个参数是固定写法不需要变动。第二个位置参数是模板文件。还可以有一个可选的第三参数一个字典包含需要传递给模板的数据。最后render函数返回一个经过字典数据渲染过的模板封装而成的HttpResponse对象。
返回404错误的两种方法
def detail(request, question_id):try:question Question.objects.get(pkquestion_id)except Question.DoesNotExist:raise Http404(Question does not exist)return render(request, polls/detail.html, {question: question.question_text})from django.shortcuts import get_object_or_404, render
from .models import Questiondef detail(request, question_id):question get_object_or_404(Question, pkquestion_id)return render(request, polls/detail.html, {question: question})get_object_or_404()方法将一个Django模型作为第一个位置参数后面可以跟上任意数量的关键字参数如果对象不存在则弹出Http404错误。
同样还有一个get_list_or_404()方法和上面的get_object_or_404()类似只不过是用来替代filter()函数当查询列表为空时弹出404错误。filter是模型API中用来过滤查询结果的函数它的结果是一个列表集。而get则是查询一个结果的方法和filter是一个和多个的区别
为什么我们使用辅助函数get_object_or_404()而不是自己捕获ObjectDoesNotExist异常呢还有为什么模型 API 不直接抛出ObjectDoesNotExist而是抛出 Http404呢因为这样做会增加模型层和视图层的耦合性。指导 Django 设计的最重要的思想之一就是要保证松散耦合。一些受控的耦合将会被包含在django.shortcuts模块中。
在 {% for %}循环中的方法调用——question.choice_set.all其实就是Python的代码question.choice_set.all(),它将返回一组可迭代的Choice对象并用在{% for %}标签中。
删除模板中硬编码的URLs
此处的 app 名以 polls 为例 在 templates/polls/index.html文件中还有一部分硬编码存在也就是href里的“/polls/”部分 它对于代码修改非常不利。设想如果你在urls.py文件里修改了路由表达式那么你所有的模板中对这个url的引用都需要修改这是无法接受的
我们给urls定义了一个name别名可以用它来解决这个问题。具体代码如下
lia href{% url detail question.id %}{{ question.question_text }}/a/liDjango会在polls.urls文件中查找namedetail’的路由具体的就是下面这行
path(int:question_id/, views.detail, namedetail),举个栗子如果你想将polls的detail视图的URL更换为polls/specifics/12/那么你不需要在模板中重新修改url地址了仅仅只需要在polls/urls.py文件中将对应的正则表达式改成下面这样的就行了所有模板中对它的引用都会自动修改成新的链接
# 添加新的单词specifics
path(specifics/int:question_id/, views.detail, namedetail),URL names的命名空间
可以在polls/urls.py文件的开头部分添加一个app_name的变量来指定该应用的命名空间
from django.urls import path
from . import viewsapp_name polls # 重点是这一行urlpatterns [path(, views.index, nameindex),path(int:question_id/, views.detail, namedetail),path(int:question_id/results/, views.results, nameresults),path(int:question_id/vote/, views.vote, namevote),
]现在让我们将代码修改得更严谨一点将templates/polls/index.html中的
lia href{% url detail question.id %}{{ question.question_text }}/a
/li修改为:
lia href{% url polls:detail question.id %}{{ question.question_text }}/a/li