Python 项目实践三(Web应用程序)第二篇

接着上节的继续学习,使用Django创建网页的过程通常分三个阶段:定义URL、编写视图和编写模板。首先,你必须定义URL模式,每个URL都被映射到特定的视图——视图函数获取并处理网页所需的数据。视图函数通常调用一个模板,后者生成浏览器能够理解的网页。为明白其中的工作原理,我们来创建学习笔记的主页。我们将定义该主页的URL、编写其视图函数并创建一个简单的模板。

一 创建网页:学习笔记主页

1 映射URL

用户通过在浏览器中输入URL以及单击链接来请求网页,因此我们需要确定项目需要哪些URL 。主页的URL 最重要, 它是用户用来访问项目的基础URL 。当前, 基础URL(http://localhost:8000/)返回默认的Django网站,让我们知道正确地建立了项目。我们将修改这一点,将这个基础URL映射到“学习笔记”的主页。打开项目主文件夹learning_log中的文件urls.py,你将看到如下代码:

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

urlpatterns = [
    path('admin/', admin.site.urls),
    url(r'', include('learning_logs.urls', namespace='learning_logs')),
]

默认的urls.py包含在文件夹learning_log中,现在我们需要在文件夹learning_logs中创建另一个urls.py文件:

#定义learning_logs的URL模式

from django.conf.urls import url

form . import views

urlpatterns=[
    #主页
    url(r'^$',views.index,name='index')
    ]

实际的URL模式是一个对函数url()的调用,这个函数接受三个实参。第一个是一个正则表达式。Django在urlpatterns中查找与请求的URL字符串匹配的正则表达式,因此正则表达式定义了Django可查找的模式。

url()的第二个实参指定了要调用的视图函数。请求的URL与前述正则表达式匹配时,Django将调用views.index(这个视图函数将在下一节编写)。第三个实参将这个URL模式的名称指定为index,让我们能够在代码的其他地方引用它。每当需要提供到这个主页的链接时,我们都将使用这个名称,而不编写URL。

2 编写视图

视图函数接受请求中的信息,准备好生成网页所需的数据,再将这些数据发送给浏览器——这通常是使用定义了网页是什么样的模板实现的。 learning_logs中的文件views.py是你执行命令python manage.py startapp时自动生成的,当前其内容如下:

from django.shortcuts import render

当前,这个文件只导入了函数render(),它根据视图提供的数据渲染响应。下面的代码演示了该如何为主页编写视图:

from django.shortcuts import render

# Create your views here.
def index(request):
    '''学习笔记的主页'''
    return render(request,'learning_logs/index.html')

3 编写模板

模板定义了网页的结构。模板指定了网页是什么样的,而每当网页被请求时,Django将填入相关的数据。模板让你能够访问视图提供的任何数据。我们的主页视图没有提供任何数据,因此相应的模板非常简单。

<p>Learning Log</p>
<p>Learning Log helps you keep track of your learning, for any topic you're
learning about.</p>

如果你请求这个项目的基础URL——http://localhost:8000/,将看到刚才创建的网页,而不是默认的Django网页。Django接受请求的URL,发现该URL与模式r'^$'匹配,因此调用函数views.index(),这将使用index.html包含的模板来渲染网页,结果如图:

提示:上面有一个问题,就是报一个错误:

  path(r'', include('learning_logs.urls', namespace='learning_logs') ),
  File "D:\study\python\code\learning_log\11_env\lib\site-packages\django\urls\conf.py", line 39, in include
    'Specifying a namespace in include() without providing an app_name '
django.core.exceptions.ImproperlyConfigured: Specifying a namespace in include() without providing an app_name is not supported. Set the app_name attribute in the included module, or pass a 2-tuple containing the list of patterns and app_name instead.

一定要在D:\study\python\code\learning_log\learning_log下面的urls.py改成如下:

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

urlpatterns = [
    path('admin/', admin.site.urls),
    path(r'',include('learning_logs.urls', namespace='learning_logs')),
]

并在D:\study\python\code\learning_log\learning_logs下面的urls.py加上:app_name='learning_logs'如下:

#定义learning_logs的URL模式

from django.conf.urls import url

from . import views
app_name='learning_logs'
urlpatterns=[
    #主页
    url(r'^$',views.index,name='index')
    ]

二 创建其他网页

制定创建网页的流程后,可以开始扩充“学习笔记”项目了。我们将创建两个显示数据的网页,其中一个列出所有的主题,另一个显示特定主题的所有条目。对于每个网页,我们都将指定URL模式,编写一个视图函数,并编写一个模板。但这样做之前,我们先创建一个父模板,项目中的其他模板都将继承它。

1 模板继承

父模板:

我们首先来创建一个名为base.html的模板,并将其存储在index.html所在的目录中。这个文件包含所有页面都有的元素;其他的模板都继承base.html。当前,所有页面都包含的元素只有顶端的标题。我们将在每个页面中包含这个模板,因此我们将这个标题设置为到主页的链接:

<p>
  <a href="{% url 'learning_logs:index' %}">Learning Log</a>
</p>
{% block content %}{% endblock content %}

2 子模板

现在需要重新编写index.html,使其继承base.html,如下所示:

{% extends "learning_logs/base.html" %}

{% block content %}
  <p>Learning Log helps you keep track of your learning, for any topic you're
  learning about.</p>
{% endblock content %}

今天有事就先写到这里吧,明天继续学习!

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏散尽浮华

webvirtmgr-重命名kvm虚拟机的名称

之前部署了Webvirtmgr平台管理kvm虚拟机,由于虚拟机在创建时名称是顺便起的,后续在虚拟机上部署了部分业务。为了便于管理,最好将虚拟机的名称重置下。 现...

2908
来自专栏DannyHoo的专栏

禁止子视图响应父视图的点击事件

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u010105969/article/details/...

1601
来自专栏linux驱动个人学习

HDMI驱动热插拔检测方法

a. 创建class_create("switch"); /sys/class/switch

1472
来自专栏柠檬先生

hibernate-笔记

什么是 hibernate 框架     1.hibernate 框架应用在 javaee 三次结构中 dao 层框架     2.在dao 层里面对数据库做c...

2037
来自专栏我是攻城师

最近工作中遇到ElasticSearch一些问题总结

55710
来自专栏编程

20条最最常用的Linux命令讲解

推荐阅读 微服务: springboot系列教程学习 源码:Javaweb练手项目源码下载 调优:十五篇好文回顾 面试笔试:面试笔试整理系列 玩过Linux的人...

1966
来自专栏云端漫步

harbor源码分析之部署脚本解析(二)

在第一篇harbor源码系列中,对整个体系做了拆分. 开发的主线是从源码--->构建----->部署.那么源码学习就要逆操作部署----->构建----->源码

1180
来自专栏架构说

tcp粘包问题补充

上篇文章 提到阻塞(block)一下如何read数据 这里针对是非阻塞如何read数据 并且纠正前面出现几个错误 (1) 非阻塞 遇到errno=EAGAIN必...

2956
来自专栏xingoo, 一个梦想做发明家的程序员

Log4j官方文档翻译(二、架构设计)

log4j遵循层次化架构,每个层都有不同的对象来执行不同的任务。这种层次话的结构灵活设计、易于未来的扩展。 log4j框架中有两种对象: 核心对象:框架的...

1925
来自专栏前端黑板报

Nginx入门

1.安装 brew install nginx Mac配置目录: /usr/local/etc/nginx/nginx.conf 2.常用命令 ...

2198

扫码关注云+社区

领取腾讯云代金券