Django - 视图和模板

这篇具有很好参考价值的文章主要介绍了Django - 视图和模板。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

视图

视图 - 是具体的业务代码

在 app 下的 views.py 文件中编写代码

from django.http import HttpResponse

def index(request):
    return HttpResponse("这里是我的站点")

 
  为了调用该视图,我们还需要编写urlconf,也就是路由配置。在polls目录中新建一个文件,名字为urls.py(不要换成别的名字),在其中输入代码如下:

from django.urls import path
from . import views
urlpatterns = [
    path('', views.index, name='index'),
]

 
  接下来,在项目的主urls.py文件中添加urlpattern条目,指向我们刚才建立的polls这个app独有的urls.py文件,这里需要导入include模块。打开mysite/urls.py文件,代码如下:

from django.contrib import admin
from django.urls import include, path

urlpatterns = [
    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, name="index"),
    path("<int:question_id>/", views.detail, name="detail"),
    path("<int:question_id>/results/", views.results, name="results"),
    path("<int:question_id>/vote/", views.vote, name="vote"),

]

“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 Question


def 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 Question


def 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(pk=question_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 Question


def detail(request, question_id):
    question = get_object_or_404(Question, pk=question_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别名,可以用它来解决这个问题。具体代码如下:

<li>
	<a href="{% url 'detail' question.id %}">
		{{ question.question_text }}
		</a>
	</li>

Django会在polls.urls文件中查找name='detail’的路由,具体的就是下面这行:

path('<int:question_id>/', views.detail, name='detail'),

举个栗子,如果你想将polls的detail视图的URL更换为polls/specifics/12/,那么你不需要在模板中重新修改url地址了,仅仅只需要在polls/urls.py文件中,将对应的正则表达式改成下面这样的就行了,所有模板中对它的引用都会自动修改成新的链接:

# 添加新的单词'specifics'
path('specifics/<int:question_id>/', views.detail, name='detail'),

URL names的命名空间

可以在polls/urls.py文件的开头部分,添加一个app_name的变量来指定该应用的命名空间:

from django.urls import path
from . import views


app_name = 'polls'   # 重点是这一行

urlpatterns = [
    path('', views.index, name='index'),
    path('<int:question_id>/', views.detail, name='detail'),
    path('<int:question_id>/results/', views.results, name='results'),
    path('<int:question_id>/vote/', views.vote, name='vote'),
]

现在,让我们将代码修改得更严谨一点,将templates/polls/index.html中的

<li>
	<a href="{% url 'detail' question.id %}">
		{{ question.question_text }}
		</a>
</li>

修改为:

<li>
	<a href="{% url 'polls:detail' question.id %}">
		{{ question.question_text }}
		</a>
	</li>

 
  文章来源地址https://www.toymoban.com/news/detail-847481.html

到了这里,关于Django - 视图和模板的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Python web实战之 Django 的模板语言详解

    Python、web开发、Django、模板语言     作为 Python Web 开发的框架之一,Django 提供了一套完整的 MVC 模式,其中的模板语言为开发者提供了强大的渲染和控制前端的能力。本文介绍 Django 的模板语言。   Django 的模板语言是一种基于 HTML 的模板语言,它提供了丰富的标签和过滤器

    2024年02月14日
    浏览(52)
  • Django基础讲解-路由控制器和视图(Django-02)

    参考链接: Django源码阅读:路由(二) - 知乎 Route路由, 是一种映射关系!路由是把客户端请求的  url路径与视图进行绑定  映射的一种关系。 这个/timer通过路由控制器最终匹配到myapp.views中的视图函数 timer 。 在django中所有的路由最终都被保存到一个变量 urlpatterns , urlpatt

    2024年02月07日
    浏览(32)
  • Django之视图

    一)文件与文件夹 当我们设定好一个Djiango项目时,里面会有着view.py等文件,也就是文件的方式: 那么我们在后续增加app等时,view.py等文件会显得较为臃肿,当然也根据个人习惯,这时我们可以使用文件夹的方式: 原本我的views.py中有着这些函数: 现在我在web的app下命名一

    2024年02月07日
    浏览(37)
  • Django基础3——视图函数

    模块类型 函数释义 http HttpResponse:给客户端返回结果信息。 FileResponse:下载文件。 JsonResponse:返回JSON。 StreamingHttpResponse:响应可迭代对象。 shortcuts render:响应HttpResponse对象,一个快捷函数。 redirect:跳转函数 views generic view 类视图继承的类。 decorators csrf csrf_exempt,csrf_pr

    2024年02月11日
    浏览(34)
  • Django视图

    一、url路由 自上而下的,如果匹配的路由中是包含int转换器,则不能匹配其他的不是int的相关字符,譬如文字等; 自定义路由转换器: 1、创建一个converter.py的文件; 2、再写一个类: class FourDigitYearConverter: regex = ‘[0-9]{4}’ # 类属性,一个字符串形式的正则表达式属性 def

    2024年02月05日
    浏览(32)
  • Django登录注销视图

    Django在身份验证框架中包含了一些你可以直接使用的表单和视图。在大多数情况下,可以使用默认的Django认证视图。 Django在django.contrib.auth.views提供了以下基于类的视图来处理身份验证: LoginView:处理登录表单并登录用户 LogoutView:注销用户 Django提供了以下视图来处理密码修

    2024年01月21日
    浏览(38)
  • Django密码修改和重置视图

    Django除了提供身份登录和注销视图,还提供了密码修改和重置的视图。 目录 修改密码视图 重置密码视图 自定义模版 关于Django身份验证更多内容,请查看 Django身份验证初试-CSDN博客 Django登录注销视图-CSDN博客 集成Django的身份验证视图来修改密码。 打开account应用的urls.py文件

    2024年01月22日
    浏览(57)
  • Django 9 常用通用视图分析

    提供基于不同http方法执行不同逻辑的功能。 1. 创建 terminal输入 django-admin startapp the_13回车  2.tutorial子文件夹 settings.py注册一下 3. tutorial子文件夹 urls.py 4. the_13views.py  ctrl + 鼠标左键 点击 View可以看源码里面的View方法 。 as_view方法里面重写了view方法,这个view方法返回dispa

    2024年01月21日
    浏览(43)
  • Django笔记(四):视图views

    视图view处理客户端请求并生成响应数据,可简单认为编写接口的部分。 上述index视图,会返回一个“hello world”的响应。 render返回html,JsonResponse返回json格式(字典),redirect重定向到其他页面,可以是个完整url也可以是某个路由的name,笔记(三)urls中每条路由配置可以设置

    2024年01月19日
    浏览(31)
  • Django框架之视图HttpResponse 对象

    本篇文章主要内容为:视图中HttpResponse对象的属性、方法及json、redirect子类包含使用cookie使用、跳转、json返回的示例。 HttpResponse对象是对用户访问的响应,与HttpRequest对象由django创建,HttpResponse对象是由开发人员创建。HttpResponse对象属于django.http模块,可以通过向构造函数传

    2024年02月04日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包