django笔记4

10 篇文章 1 订阅
8 篇文章 0 订阅

通过模板继承创建其他页面

父模板

在index.html所在目录创建一个base.html

这个模板包含所有页面都有的元素,而其他模板都继承它。

当前,所有页面都包含的元素只有顶端的标题。因为每个页面都包含这个模板,所以将这个标题设置为到主页的链接:

base.html

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

{% block content %}{% endblock content %}

{% %}为模板标签 ,生成要在页面中显示的信息。这里的模板标签{% url 'learning_logs:index' %} 生成一个URL,该URL与在learning_logs/urls.py中定义的名为'index' 的URL模式匹配。learning_logs 是一个命名空间 ,而index 是该命名空间中一个名称独特的URL模式。

在简单的HTML页面中,链接是使用锚 标签<a> 定义的,如:<a href="link_url">link text</a>

 

子模板

向index.html添加如下代码,继承base.html

index.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 %}

子模板的第一行必须包含标签{% extends %} ,让Django知道它继承了哪个父模板。

{% block %} 标签,定义content 块。

 

URL模式

修改learning_logs/urls.py,定义显示所有主题的页面的URL,这里用topics。

urls.py

"""为learning_logs定义URL模式。"""
  --snip--
  urlpatterns = [
      # 主页
      path('', views.index, name='index'),
      # 显示所有的主题。
      path('topics/', views.topics, name='topics'),
  ]

 

视图

修改视图views,函数topics() 需要从数据库中获取一些数据,并将其交给给模板。

views.py

from django.shortcuts import render

from .models import Topic

def index(request):
    --snip--

def topics(request):
      """显示所有的主题。"""
    topics = Topic.objects.order_by('date_added')
    context = {'topics': topics}
    return render(request, 'learning_logs/topics.html', context)

定义一个将发送给模板的上下文。上下文 是一个字典,其中的键是将在模板中用来访问数据的名称,而值是要发送给模板的数据。

这里只有一个键值对,包含一组将在页面中显示的主题。创建使用数据的页面时,除了对象request 和模板的路径外,还将变量context 传递给render()。

 

模板

在index.html所在的目录中,创建一个topics.html,来接受字典context ,和使用topics() 提供的数据。

topics.html

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

{% block content %}

<p>Topics</p>

<ul>
  {% for topic in topics %}
    <li>{{ topic }}</li>
  {% empty %}
    <li>No topics have been added yet.</li>
  {% endfor %}
</ul>

{% endblock content %}

标签<ul></ul>为无序列表。

for 循环的模板标签遍历字典context 中的列表topics。

要在模板中打印变量,需要将变量名用双花括号括起。因此每次循环时{{ topic }} 都被替换为topic 的当前值。

模板标签{% empty %} ,它告诉Django在列表topics 为空时该如何办。这里是打印一条消息,告诉用户还没有添加任何主题。

 

最后,修改父模板,使其包含到显示所有主题的页面的链接:

base.html

<p>
  <a href="{% url 'learning_logs:index' %}">Learning Log</a> -
  <a href="{% url 'learning_logs:topics' %}">Topics</a>
</p>

{% block content %}{% endblock content %}

在到主页的链接后面添加一个连字符“-”,再添加一个到显示所有主题的页面的链接,使用的也是模板标签{% url %} 。这行让Django生成一个链接,它与learning_logs/urls.py中名为'topics' 的URL模式匹配。

现在如果刷新浏览器中的主页,将看到链接Topics。如果单击这个链接,将显示子页面。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ddxn417

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值