栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

【邂逅Django】——(三)视图

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

【邂逅Django】——(三)视图

 邂逅Django - 目录

✅ Part 1:【邂逅Django】—— (一)创建项目

✅ Part 2:【邂逅Django】—— (二)数据库配置

✅ Part 3:【邂逅Django】—— (三)视图

️ Part 4:【邂逅Django】—— (四)表单和通用视图

️ Part 5:【邂逅Django】—— (五)完善界面(自定义界面和样式)

️ Part 6:【邂逅Django】—— (六)自定义管理界面

️ Part 7:【邂逅Django】—— (七)自动化测试


文章目录
  •  邂逅Django - 目录
  •  前言
  • 一、视图概述
  • 二、编写视图
  • 三、添加`url`
  • 四、写一个真正有用的视图
  • 五、自定义模板
    •  5.1 模板目录说明
    •  5.2 创建模板文件
    •  5.3 使用模板
    •  5.4 使用模板(一个快捷函数):`render()`
    •  5.5 抛出404错误
  • 六、取出模板中的硬编码`URL`
  • 七、为`URL`添加命名空间
  • 总结


 前言

本系列文章,在Django官方文档教程的基础模板下,进行了一定的改进和删除,添加了一些自己的见解。

希望大家看完该系列文章后,对Django能够有一个清晰的认识。

路漫漫兮其修远兮,吾将上下而求索!

Django官方文档:https://www.djangoproject.com/

❗ ❗ ❗ 学习过程中,多看官方文档,可以解决很多问题 ❗ ❗ ❗

本教程使用poetry对项目环境进行管理。
相关poetry的安装与使用,请参考【Python - 虚拟环境】项目的启动,从隔离开发环境开始_CoderChaos的博客-CSDN博客_python 虚拟环境启动

项目地址:https://github.com/CoderBerryRabbit/MeetDjango

一、视图概述

Django中的视图概念是【一类具有相同功能和模板的网页集合】。比如,在一个博客应用中,可能会创建如下视图:

  • 博客首页 —— 展示最近的几项内容
  • 内容详情页 —— 详细展示某项内容
  • 以年为单位的归档页 —— 展示选中的年份里各个月份创建的内容
  • 以月为单位的归档页 —— 展示选中的月份里各天创建的内容
  • 以天为单位的归档页 —— 展示选中天里创建的所有内容
  • 评论处理器 —— 用于响应内容添加评论的操作

而在投票应用中,需要以下几个视图:

  • 问题索引页 —— 展示最近的几个投票问题
  • 问题详情页 —— 展示某个投票的问题和不带结果的选项列表
  • 问题结果页 —— 展示某个投票的结果
  • 投票处理器 —— 用于响应用户为某个问题投票的操作

在Django中,网页和其他内容都是从视图派生而来的。每一个视图表现为一个Python函数(对于基于类的视图来说,表现为一个方法)。Django会根据用户请求的URL来选择使用哪个视图。

为了将URL和视图关联起来,Django使用URLconfs来配置。URLconf将URL映射到视图。

二、编写视图
# polls/views.py
from django.shortcuts import render
from django.http import HttpResponse


def index(request):
    return HttpResponse("Hello, world. You're at the polls index.")


def detail(request, question_id):
    return HttpResponse(f"You're looking at question {question_id}")


def results(request, question_id):
    response = "You're looking at the results of question {}"
    return HttpResponse(response.format(question_id))

def vote(request, question_id):
    return HttpResponse("You're voting on question %s." % question_id)
三、添加url
# polls/urls.py
from django.urls import path

from . import views

urlpatterns = [
    path("", views.index, name="index"),
    path("/", views.detail, name="detail"),
    path("/results/", views.results, name="results"),
    path("/vote/", views.vote, name="vote"),
]

启动Django开发服务器,可以在浏览器输入以下URL进行查看:

  • index - http://127.0.0.1:8000/polls/
  • detail - http://127.0.0.1:8000/polls/1/
  • results - http://127.0.0.1:8000/polls/1/results/
  • vote - http://127.0.0.1:8000/polls/1/vote/
四、写一个真正有用的视图

每个视图要做两件事:返回一个包含被请求页面内容的HttpResponse对象,或者抛出一个异常。

视图可以从数据库里读取记录,可以使用一个模板引擎,或者其他能用Python完成的事。

# pools/views.py
from django.shortcuts import render
from django.http import HttpResponse

from .models import Question


def index(request):
    latest_question_list = Question.objects.order_by("-pub_date")[:5]
    output = ", ".join([q.question_text for q in latest_question_list])
    return HttpResponse(output)


def detail(request, question_id):
    return HttpResponse(f"You're looking at question {question_id}")


def results(request, question_id):
    response = "You're looking at the results of question {}"
    return HttpResponse(response.format(question_id))

def vote(request, question_id):
    return HttpResponse(f"You're voting on question {question_id}")

在查看之前,可以创建一些Question的数据。

启动Django服务器,在浏览器输入http://127.0.0.1:8000/polls/进行查看。

五、自定义模板  5.1 模板目录说明

首先,在polls目录下创建一个templates目录。Django会在这个目录里查找模板文件。

在settings.py配置文件中,TEMPLATES配置项描述了Django如何载入和渲染模板。默认设置了DjangoTemplates后端,并将APP_DIRS设置为True。这一选项将会让DjangoTemplates在每个INSTALLED_APPS文件夹下寻找templates子目录。
这就是为什么没有进行DIRS的设置,Django也能正确找到polls的模板位置的原因。

说明:虽然可以将模板文件直接放在polls/templates文件夹中(而不是再建立一个polls子文件夹),但是这样做不太好。Django会选择第一个匹配的模板文件,如果有一个模板文件和另一个应用中的目标文件重名,Django没有办法区分它们。我们需要Django选择正确的模板,最好的方法就是把它们放入各自的命名空间中,也就是把这些模板放入一个和自身应用重名的子文件夹里。

 5.2 创建模板文件
// polls/templates/polls/index.html
{% if latest_question_list %}
    
{% endif %}
# polls/templates/polls/detail.html

{{ question.question_text }}

    {% for choice in question.choice_set.all %}
  • {{ choice.choice_text }}
  • {% endfor %}
 5.3 使用模板
# polls/views.py
from django.shortcuts import render
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))

开启Django服务器,输入http://127.0.0.1:8000/polls/进行查看。

 5.4 使用模板(一个快捷函数):render()
from django.http import HttpResponse
from django.shortcuts import render
from django.template import loader

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)

使用render,不再需要导入loader和HttpResponse。不过如果还有其他函数(比如detail、results和vote)需要用到的话,就需要保持HttpResponse的导入。

 5.5 抛出404错误
# polls/views.py
from django.http import HttpResponse, Http404
from django.shortcuts import render
from django.template import loader

from .models import Question

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})

开启Django服务器,输入http://127.0.0.1:8000/polls/1/或http://127.0.0.1:8000/polls/100/进行查看。

一个快捷函数:get_object_or_404()

# polls/views.py
from django.http import HttpResponse, Http404
from django.shortcuts import render, get_object_or_404
from django.template import loader

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})
六、取出模板中的硬编码URL

在polls/index.html中,链接硬编码:

  • {{ question.question_text }}
  • 问题在于,硬编码和强耦合的链接,对于一个包含很多应用的项目来说,修改起来十分困难。然而,在polls.urls的url()函数中,通过name参数为URL定义了命名,可以使用https://blog.csdn.net/m0_67891836/article/details/{% url%}标签代替它:

  • {{ question.question_text }}
  • 这个标签的工作方式是,在polls.urls模块的URL定义中寻找具有指定名字的条目。

    如果想改变投票详情视图的URL,比如想改成polls/specifics/12/,不用在模板里修改任何东西(包括其他模板),只要在polls/urls.py里稍微修改以下就可以:

    path("specifics//", views.detail, name="detail")
    
    七、为URL添加命名空间

    在一个真实的Django项目中,可能会有五个、十个、二十个,甚至更多应用。Django如何分辨重命名的URL呢?

    在根URLconf中添加命名空间。在polls/urls.py文件中稍作修改,加上app_name设置命名空间:

    # polls/urls.py
    from django.urls import path
    
    from . import views
    
    app_name = "polls"
    urlpatterns = [
        path("", views.index, name="index"),
        path("/", views.detail, name="detail"),
        path("/results/", views.results, name="results"),
        path("/vote/", views.vote, name="vote"),
    ]
    

    现在编辑polls/index.html,修改:

  • {{ question.question_text }}
  • 修改为指向具有命名空间的详细视图:

  • {{ question.question_text }}

  • 总结

    本文简单介绍了Django模板、自定义模板,以及模板和URL之间的映射关系。

    转载请注明:文章转载自 www.mshxw.com
    本文地址:https://www.mshxw.com/it/1005280.html
    我们一直用心在做
    关于我们 文章归档 网站地图 联系我们

    版权所有 (c)2021-2022 MSHXW.COM

    ICP备案号:晋ICP备2021003244-6号