Django学习笔记(4)创建其他网页

每一个网页,都需要三步,指定URL模式;编写视图函数;编写模板。

4.1 模板继承
在一个项目中,通常有一个用于整个网站的父模板base.html, 并且网站的每个主要部分都有一个父模板,每个部分的父模版继承base.html, 网站的每个网页继承相应部分的父模板。这种配置便于修改网站,效率更高。
4.1.1 父模板
创建一个父模板,名字叫base.html, 将其存储在index.html所在目录中。
创建包含项目名的段落,是一个到主页index的链接.
为了创建链接,使用了一个模板标签{%%}, 模板标签{% url ‘learning_logs:index’ %}生成一个URL, 该URL与learning_logs/urls.py中命名为index的URL模式匹配。
插入一对块标签,块名为content, 是一个占位符。


<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>basehtmltitle>
head>
<body>
<p>
    <a href="{% url 'learning_logs:index' %}">Learning Loga>
p>
{% block content %}
{% endblock content %}
body>
html>

4.2.2 子模板
子模板继承父模板{% extends “learning_logs/base.html” %}
子模板的块标签中的内容写在{% block content %}与{% endblock content %}之间。


<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>indextitle>
head>
<body>
{% extends "learning_logs/base.html" %} 
{% block content %}
<p>Learning Logp>

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

body>
html>

4.2 显示所有主题的页面
URL模式:

"""定义learning_logs的URL模式"""

from django.conf.urls import url
from . import views

urlpatterns = [
    # 主页
    url(r'^$', views.index, name='index'),
    # 显示所有的主题
    url(r'^topics$', views.topics, name='topics'),
]

app_name = 'learning_logs'

视图:

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

模板:


<html lang="en">
<head>
   <meta charset="UTF-8">
   <title>Topicstitle>
head>
<body>
{% extends "learning_logs/base.html"%}

{% block content %}
   <p>Topicsp>

   <ul>
   {% for topic in topics %}
       <li>{{ topic }}li>
       {% empty %}
       <li>
       话题没有被创建。
       li>
   {% endfor %}
   ul>
{% endblock content %}
body>
html>

在模板中,循环结束用 {% endfor %}来表示。
模板中的循环:

{% for item in list %}
  do something with each item
{% endfor %}

修改父模板,使其包含到子模板的链接。


<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>basehtmltitle>
head>
<body>
<p>
    <a href="{% url 'learning_logs:index' %}">Learning Loga>-
    <a href="{% url 'learning_logs:topics' %}">Topicsa>
p>
{% block content %}{% endblock content %}
body>
html>

主页链接后加了一个连字符(-) ,然后添加了另一个子模版的页面链接。

4.3 显示特定主题的页面
同样地,需要定义一个URL模式,编写一个视图,创建一个模板。
URL模式:

"""定义learning_logs的URL模式"""

from django.conf.urls import url
from . import views

urlpatterns = [
    # 主页
    url(r'^$', views.index, name='index'),
    # 显示所有的主题
    url(r'^topics$', views.topics, name='topics'),
    # 特定主题的详细页面
    url(r'^topics/(?P\d+)/$', views.topic, name='topic'),
]

app_name = 'learning_logs'

详细研究正则表达式r’^topics/(?P\d+)/$’, 将匹配到的URL中的值存储到topic_id变量中。

视图:

def topic(request, topic_id):
    """显示单个主题及其所有的条目"""
    topic = Topic.objects.get(id=topic_id)
    entries = topic.entry_set.order_by('-date_added')
    context = {'topic': topic, 'entries': entries}
    return render(request, 'learning_logs/topic.html', context)

与前面的视图函数不同,views.topic()除了接收request外,还会接收特定的topic_id, 用于查询。
topic = Topic.objects.get(id=topic_id)
entries = topic.entry_set.order_by(’-date_added’)
date_added前的减号指定了按照降序排列。

模板
继承父模板:{% extends ‘learning_logs/base.html’ %}
在项目列表中,用遍历获取每个条目的时间戳和文本信息。
Django模板中的竖线(|)表示模板过滤器。
过滤器date:‘M d, Y H:i’ , 表明显示时间戳的格式,注意这里date:'M中间没有空格,否则匹配会失败。
过滤器linebreaks, 将包含换行符的条目转换成浏览器能够理解的格式。


<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Topictitle>
head>
<body>
{% extends 'learning_logs/base.html' %}

{% block content %}
  <p>Topicp>
  <p>Entries:p>
  <ul>
  {% for entry in entries %}
      <li>
          <p>{{ entry.date_added|date:'M d, Y H:i' }}p>
          <p>{{ entry.text|linebreaks }}p>
      li>
      {% empty %}
      <li>
      There are no entries for this topic yet.
      li>
  {% endfor %}
  ul>
{% endblock content %}
body>
html>

修改模板topics.html,让每个主题都可以链接到相应的网页。

<body>
{% extends "learning_logs/base.html"%}

{% block content %}
    <p>Topicsp>

    <ul>
    {% for topic in topics %}
        <li>
            <a href="{% url 'learning_logs:topic' topic.id %}">{{ topic }}a>
        li>
        {% empty %}
        <li>
        话题没有被创建。
        li>
    {% endfor %}
    ul>
{% endblock content %}
body>

URL模式要求提供实参topic_id, 所以在模板标签url中添加属性topic.id.

你可能感兴趣的:(python,Django)