使用Django创建网页的过程分为三个阶段:定义URL    视图模板    编写模板

首先你必须定义URL模式,URL模式描述了URL是如何设计的,让Django知道如何将浏览器请求与网站URL匹配,以确定返回哪个page.

每个URL都被映射到特定的视图-----视图函数获取并处理网页所需的数据,视图函数通常调用一个模板,后者生成浏览器能够理解的page

为明白其中的工作原理,我们来创建一个主页,我们将定义该主页的URL,编写其视图函数并创建一个简单的模板

暂时让这个网页尽可能的简单,Web应用程序能够正常运行后,设置样式可使其更有趣,但中看不中用的应用程序毫无意义.就目前而言,主页只显示标题和简单的描述.


映射URL

用户通过浏览器中输入url以及单击链接来请求网页,因此我们需要确定项目需要哪些URL.主页的URL最重要,它是用户用来访问项目的基础URL

当前我们的URL返回的是Django的网页,让我们知道我们已经正确地建立了项目,我们需要修改这一点,将这个基础URL映射到我们的主页上

打开项目文件夹learning_log中的文件urls.py,你将看到如下代码:

注意:新版没有调用 from django.conf.urls import include,url 所以需要加入

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

from django.conf.urls import include,url

urlpatterns = [
    path('admin/', admin.site.urls),
]



emm.....每个版本的venv可能会有所不同,或者每个python版本创建的项目会有点点不一样,但是...

前两行导入的都是管理网站和url所需的函数和模块.变量urlpatterns包含项目中的应用程序的URL

最后一行的代码包含模块 admin.site.urls 该模块定义了可在管理网站中请求的所有URL

我们需要包含learning_logs的URL

那么我们在末尾加入:

url(r'',include('learning_logs.urls',namespace='learning_logs')),#别忘了末尾的逗号


我们在这里添加了一行代码来包含模块learning_logs.urls 这行代码包含实参namespace

让我们能够将learning_logs的URL同项目中其他的URL区分开来,这在项目开始扩展时很有用

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


#定义learning_logs的URL模式
from django.conf.urls import url

from . import views

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

为弄清楚当前位于哪个urls.py文件中,我们在这个文件开头添加了一个注绎,接下来我们导入函数url 因为我们需要使用它来将url映射到视图


我们还导入了模块views 其中的句号让python从当前的urls.py模块所在的文件夹中导入视图

在这个模块中,遍历urlpatterns是一个列表,包含可在应用程序learning_logs中请求的网页page

实际的url模式是一个对函数url()的调用.这个函数接受三个实参,见最后一行代码

第一个r'^$'

是一个正则表达式其中的r让python将接下来的字符串视为原始字符串,而引号告诉python正则表达式始于^终于$

总之这个正则表达式让python查找开头和末位之间没有任何东西的URL

python忽略项目的基础URL(http://localhost:8000/) 因此这个正则表达式只能与基础URL匹配,其他的URL都与这个正则表达式不匹配

如果请求的URL与URL模式不匹配,Django将返回一个错误页面


第二个views.index

url()的第二个实参,制定了要调用的视图函数,请求的url与前述正则表达式匹配时,Django将调用views.index


第三个name='index'

第三个实参将这个URL模式的名称指定为index,让我们能够在代码的其他地方引用他,每当需要提供到这个主页的链接时,我们都将使用这个名称,而不是编写URL


正则表达式通常被称为regex,几乎每种编程语言都用它.它的用途多的难以置信.但是需要经过一定的练习才能掌握.


编写视图

视图函数接受请求中的信息,准备好生成网页所需的数据,再将这些数据发送给浏览器--------这通常是使用定义了网页是什么用的模板实现的.

learning_logs中的文件views.py是你执行命令 python manage.py startapp的时候自动生成的,当前内容如下:


from django.shortcuts import render

# Create your views here.

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




def index(request):

#学习笔记的主页

    return render(request,'learning_logs/index.html')

URL请求与我们刚才定义的模式匹配时,Django将在文件views.py中查找函数index(),再将请求对象传递给这个视图函数


在这里我们先不需要处理任何数据,因此这个函数值包含调用render()的代码,这里向函数render()提供了两个实参:

原始请求对象 以及一个可用于创建网页的模板.


编写模板

 模板定义了网页的结构,模板指定了网页是什么样子的,每当网页被请求时,Django将填入相关的数据,模板让你能够访问视图提供的任何数据.

我们的主页视图没有提供任何数据,因此模板非常简单


在文件夹learning_logs中新建一个文件夹命名为templates,在这个文件夹内再建立一个learning_logs

这样是一种习惯,templates为模板文件夹,而模板可以有很多个,所以我们创建的第一个就是原始的模板 learning_logs,所以建立这个文件夹

在learning_logs的模板文件夹内,新建一个index.html,在里面编写如下代码

<p>Hello Im Your Learning Page !</p>

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

learning about.</p>

注意:以上是html语言

现在,如果你请求这个项目的URL     http://localhost:8000 

将看到你刚才创建的网页,而不是Django默认的页面了


Django接受请求的URL,发现该URL与正则表达式匹配,因此调用函数views.index().这将使用index.html包含的模板来渲染网页

注意:

如果你的Django版本过高,那么你会发现你在做完这一切之后出现和我一样的问题

    '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.

如果确定你出现了这样的问题,那么在你的子项目中(就是learning_log里面的learning_logs),其实就是实际应用程序的urls.py文件里面添加如下代码

#定义learning_logs的URL模式
from django.conf.urls import url

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

--------------------------------------------------------------------------------------------------------------------------------------------------------------

在Django项目中定义namespace时出现Specifying a namespace in include() without providing an app_name的报错信息  需要定义一个app_name的声明信息  即可解决此问题:

app_name = 'users'  //在子应用中添加此句 'users'是你子应用的名字  

urlpatterns = [

   ...]






最后修改:2022 年 12 月 05 日
如果觉得我的文章对你有用,请随意赞赏