Django模板
在本教程中,我们将学习什么是Django模板。
稍后,我们将在一个简单的Python Web应用程序中实现它们。
快速Django设定
让我们按照Django教程中的步骤操作,以从命令行终端快速设置虚拟环境,Django Project和Django App。
转到要其中创建新项目的目录,并依次运行以下命令。
$mkdir DjangoWorld $cd DjangoWorld $virtualenv -p /usr/local/bin/python3 env $source env/bin/activate $pip3 install django $django-admin startproject TemplateProject . $django-admin startapp TemplateApp $python3 manage.py migrate $python3 manage.py runserver
将TemplateApp添加到TemplateProject中存在的settings.py文件中。
我在本教程中使用Atom IDE。
在Django App目录– TemplateApp中创建一个新文件夹template。
在" template"文件夹中,我们将创建html文件。
Web应用程序的最终项目结构如下所示:
我们也需要在TemplateApp中创建一个" urls.py"文件。
在此处,我们将定义应用的网址格式。
我们需要将该URL文件包含在TemplateProject文件夹中存在的TemplateProjecturls.py
文件中。
urlpatterns = [ re_path('admin/', admin.site.urls), re_path(r'^', include('TemplateApp.urls')) # tell django to read urls.py in TEMPLATESapp ] ]
Django模板
在之前的教程中,我们将在Django应用的" views.py"文件中设置HTML代码。
在views.py文件中,我们可以为Django编写以下设计代码;
def current_datetime(request): today = datetime.datetime.now() html = "<html><body>It is today %s.</body></html>" % today return HttpResponse(html)
用Python代码对HTML代码进行硬编码并不是构建的最佳方法。
HTML代码可以行数千行。
我们不希望在Python代码中写那1000行,因为它们与Python毫无关系。
管理此类项目将变得非常困难。
这就是Django模板将为我们提供帮助的地方。
Django模板是基本HTML代码,其中包括Django模板语言。
这种特殊的语法用于将值从Django Views python类传递到HTML代码。
如何将views.py中的数据传递给模板?
使用渲染功能。
渲染函数用于代替HttpResponse在Django模板中显示数据。
渲染功能由三部分组成:
- 请求实例
- html文件的路径
- 语境
Django模板中的上下文就像字典。
它由从Django视图传递到Django模板的键/值对组成。
Django模板语言
变量定义为:{{{variable}}`。
该变量在Context键中传递。
<html> <body> Hello {{variable}}</p> </body> </html>
从Django视图调用此模板:
def hello(request): variable = 'Anupam' return render(request, "hello.html", {'variable' : variable})
Django模板过滤器
我们可以使用过滤器在Django模板中修改变量。
在" |"字符后设置过滤器。
{{variable | upper}} –用大写字母显示变量的值。
{{variable | slice:":-5"}}"从变量中删除最后5个字符。
Django模板标签
Django模板中的标签用于表达式。
如果为elif,则通常使用for循环。
标签的定义如下:{%tag%}
–可以设置标签代替标签。
需要启动和关闭标签,如下所示:
<ul> {% for x in python_list %} <li>{{ x.name }}</li> {% endfor %} </ul>
如果是elif –否则
% if python_list|length > 10 %} <h2>Number of rows: {{ python_list|length }}</h2> {% elif story_list|length == 1 %} <h2>One row</h2> {% else %} <p>No rows<p> {% endif %}
创建Django Web应用程序
首先,在TemplateProject中转到settings.py
并将路径添加到DIR
键上的'TEMPLATE'列表中的template
目录中。
django.contrib.admin
模板是用DTL编写的。
DTL有一个流行的替代方法,即" jinja2",但我们将在以后再讨论。
我们将在Web应用程序中crHTMLng三个html页面-home,about和more.html。
首先,在TemplateApp文件夹中的" urls.py"文件中设置网址格式,如下所示:
from django.conf.urls import url from . import views urlpatterns = [ url(r'^$', views.home, name='home'), url(r'^about/$', views.about, name='about'), url(r'^more/$', views.MorePageView.as_view(), name='more'), ]
这里的" views"是指views.py文件。
MorePageView是Python类,其中我们将模板定义为视图而不是渲染。
您可以使用"渲染"功能或者"模板视图"。
下面给出了views.py文件的代码。
from django.shortcuts import render from django.http import HttpResponse from django.views.generic import TemplateView # # Create your views here. def home(request): return render(request,'home.html',{}) data = [ {'name': 'theitroad.local','link': 'https://www.theitroad.local'}, {'name': 'Android ListView','link': 'https://www.theitroad.local/9247/android-listview-example-tutorial'}, {'name': 'Android RecyclerView','link': 'https://www.theitroad.local/10024/android-recyclerview-android-cardview-example-tutorial'}, {'name': 'Android P Features','link': 'https://www.theitroad.local/21178/android-p-features'}, {'name': 'More...','link': 'more.html'}, ] def about(request): context = {'data_list' : data} return render(request,'about.html',context) class MorePageView(TemplateView): template_name = "more.html"
由于Python对缩进敏感,因此请确保坚持一致的缩进。
我们没有将上下文传递给home.html Django模板。
about函数呈现about.html模板。
其中,我们传递了一些Android教程的URL的Python字典以及指向more.html项目的内部链接。
在上面的Python类中,我们直接通过其类名调用Django模板。
我们没有传递任何上下文。
如果要使用TemplateView的此方法传递Context,请执行以下操作:
class MorePageView(TemplateView): def get(self, request, **kwargs): context = {'data_list' : data} return render(request, 'more.html', context)
get方法返回所有模板的列表。
让我们看看下面的每个Django模板HTML文件:
home.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Home</title> </head> <body> <h1>Our First Template</h1> <p> We'll be covering the following features: <ol> <li>Rendering Templates from Views</li> <li>Passing data to Templates from Views</li> <li>Django Template Syntax</li> </ol> </p> <a href="{% url 'about' %}">About</a> </body> </html>
在底部,我们使用Django模板标签提供了指向about.html页面的链接。
{%url'name_defined_in_urls'%}`。
由于名称已经在urls.py文件中定义,因此我们使用了自动URL反向查找。
这使其简洁明了。
about.html
<html lang="en"> <head> <meta charset="UTF-8"> <title>About Us</title> </head> <body> <p> This webpage consists of some of the theitroad tutorial external links: <ol> <li>Checkout the logic to differentiate external and internal links.</li> <li>Django Templates has for loops for you.</li> </ol> </p> {% for data in data_list %} {% if '.html' in data.link %} <p> <a href="{% url data.link|slice:":-5" %}">{{ data.name|upper }} </a> </p> {% else %} <p> <a href="{{ data.link }}" target="_self">{{ data.name }} </a> </p> {% endif %} {% endfor %} <a href="{% url 'home' %}">Go Home</a> </body> </html>
在上面的代码中,我们检查URL是外部还是内部。
如果是外部网址,则在a href
中设置target = _self
。
否则,使用slice运算符,我们从Django变量中删除扩展名,并执行url反向查找。
下面给出了more.html文件的代码:
<html lang="en"> <head> <meta charset="UTF-8"> <title>More</title> </head> <body> That's all for now. See you later. <br> <a href="{% url 'about' %}">About</a> <a href="{% url 'home' %}">Home</a> </body> </html>
在终端上运行命令python3 manage.py runserver: