当前位置: 首页 > article >正文

djang5 官网_polls_app_03( 关于Views)

这部分是关于如何用Django框架创建一个简单的polls app的第三部分,主要内容是关于如何创建公共界面——即“视图”(views)。

1.编写更多视图

在polls app中,我们将有以下四个视图:
问题“索引”页:显示最新的几个问题。
问题“详情”页:显示问题的文本,没有结果,但有一个投票表单。
问题“结果”页:显示特定问题的结果。
投票操作:处理对特定问题中特定选项的投票。
在Django中,网页和其他内容由视图提供。每个视图由一个Python函数(或类视图中的方法)表示。Django通过检查请求的URL(具体来说,是域名后的部分)来选择视图。

首先,在polls/views.py中添加几个视图,这些视图稍有不同,因为它们接受一个参数:

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

在这里插入图片描述

将这些新视图连接到polls.urls模块,添加以下路径调用:

from django.urls import path
from . import views

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"),
]

在这里插入图片描述

在浏览器中查看“/polls/34/”,它将运行detail()函数并显示你在URL中提供的ID。尝试“/polls/34/results/”和“/polls/34/vote/”也会显示占位符结果和投票页面。
在这里插入图片描述

2. 实际工作的视图

每个视图负责返回一个包含请求页面内容的HttpResponse对象,或引发如Http404之类的异常。视图可以使用Django的数据库API,也可以不使用。这里是一个实际显示系统中最新5个投票问题的index()视图示例:

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)

在这里插入图片描述

刷新页面可以看到下面效果:
在这里插入图片描述

为了将设计和Python代码分开,我们使用Django的模板系统。首先,在polls目录中创建一个名为templates的目录。然后在其中创建另一个名为polls的目录,并在其中创建一个名为index.html的文件。模板应该位于polls/templates/polls/index.html

使用模板系统
在polls/templates/polls/index.html中放入以下代码:

{% if latest_question_list %}
    <ul>
    {% for question in latest_question_list %}
        <li><a href="/polls/{{ question.id }}/">{{ question.question_text }}</a></li>
    {% endfor %}
    </ul>
{% else %}
    <p>No polls are available.</p>
{% endif %}

在这里插入图片描述

现在更新polls/views.py中的index视图以使用模板:

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

在这里插入图片描述
在这里插入图片描述
点击 What’s up, 可以看到:
在这里插入图片描述

Django还提供了一个快捷方式render(),可以简化加载模板、填充上下文并返回渲染模板的结果的过程。使用render()函数,我们可以重写index()视图:

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)

在这里插入图片描述
再次访问http://127.0.0.1:8000/polls/, 可以看到同样的效果:
在这里插入图片描述

3. 引发404错误

现在,开始处理显示给定投票问题文本的detail视图。如果请求的ID不存在,则视图会引发Http404异常:

from django.http import Http404
from django.shortcuts import render
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/index.html", {"question": question})

Django提供了一个快捷方式get_object_or_404(),可以简化这个过程:

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/index.html", {"question": question})

访问http://127.0.0.1:8000/polls/1/ 出现下图,即显示代码正常运行
在这里插入图片描述
在这里插入图片描述

4. 使用模板系统

在views文件中修改detail函数,把最后一行代码的 polls/index.html 改为polls/detail.html
给定上下文变量question,polls/detail.html模板可能如下所示:

<h1>{{ question.question_text }}</h1>
<ul>
{% for choice in question.choice_set.all %}
    <li>{{ choice.choice_text }}</li>
{% endfor %}
</ul>

模板系统使用点查找语法来访问变量属性。例如,{{ question.question_text }}首先在字典question上执行查找,如果失败,则尝试属性查找。如图:
在这里插入图片描述

5. 移除模板中的硬编码URL

在polls/index.html模板中,我们之前硬编码了一个问题的链接。为了不依赖于特定URL路径,可以使用{% url %}模板标签:

html

  • {{ question.question_text }}
  • 这种方式通过查找polls.urls模块中指定的URL定义来工作。 ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/eee8a3f9116a432eb280033cc29b67aa.png) 验证代码是否正常进行: ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/02fa5c3c3e794cf29a2b76e2f026e40e.png)

    6. 命名空间URL名称

    在实际的Django项目中,可能有多个应用。Django如何区分它们之间的URL名称?答案是添加命名空间到URLconf。在polls/urls.py文件中,设置应用命名空间:

    app_name = "polls"
    

    在这里插入图片描述

    现在更改polls/index.html模板,指向命名空间的detail视图:

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

    访问http://127.0.0.1:8000/polls,点击 What’s up, 可以看到:
    在这里插入图片描述
    参考链接:https://docs.djangoproject.com/en/5.1/intro/tutorial03/


http://www.kler.cn/a/391772.html

相关文章:

  • Spark:不能创建Managed表,External表已存在...
  • ML 系列: 第 24 节 — 离散概率分布(泊松分布)
  • 【深度解析】CSS工程化全攻略(1)
  • 【MySQL】数据库表连接简明解释
  • 【2024最新】基于springboot+vue的闲一品交易平台lw+ppt
  • 【css】html里面的图片宽度设为百分比,高度要与宽度一样
  • SpringBoot单体服务无感更新启动,动态检测端口号并动态更新
  • Python学习从0到1 day26 第三阶段 Spark ② 数据计算Ⅰ
  • element-plus menu菜单点击一级导航不选中二级导航的问题
  • C语言之用getopt解析命令行参数
  • java:使用Multi-Release Jar改造Java 1.7项目增加module-info.class以全面合规Java 9模块化规范
  • Unet++改进24:添加DualConv||轻量级深度神经网络的双卷积核
  • 无人机飞手考证,地面站培训技术详解
  • uniCloud云对象调用第三方接口,根据IP获取用户归属地的免费API接口,亲测可用
  • PNG图片批量压缩exe工具+功能纯净+不改变原始尺寸
  • SpringBoot项目快速打包成jar项目与部署
  • 深入浅出《钉钉AI》产品体验报告
  • Spring Boot编程训练系统:架构设计精要
  • 虚拟机linux7.9下安装mysql遇到的问题
  • 计算机低能儿从0刷leetcode | 36.有效的数独
  • 【数学二】线性代数-向量-正交规范化、正交矩阵
  • 一篇文章学会ES6 Promise
  • 8 ARM-PEG-FA由八个臂状结构的聚乙二醇(PEG)核心与叶酸(FA)分子通过化学连接而成
  • 什么是大数据治理?在企业数字化转型过程中有什么用?
  • PostgreSQL存储过程-pgAdmin
  • 命令行工具进阶指南