Django模板

时间:2020-02-23 14:33:06  来源:igfitidea点击:

在本教程中,我们将学习什么是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&apos;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 &apos;about&apos; %}">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 &apos;.html&apos; 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 &apos;home&apos; %}">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&apos;s all for now.
See you later. <br>

<a href="{% url &apos;about&apos; %}">About</a> <a href="{% url &apos;home&apos; %}">Home</a>
</body>
</html>

在终端上运行命令python3 manage.py runserver: