创建页面:学习笔记主页
三个阶段:定义URL,编写视图和编写模板
每个URL都被映射到特定的视图——视图函数获取并处理页面所需的数据。通常使用模板来渲染页面,而模板定义页面的总体结构
映射URL:
打开learning_log的urls.py
#导入一个模块和一个函数,以便对管理网站的URL进行管理
from django.contrib import admin
from django.urls import path
#定义变量urlpatterns
urlpatterns = [
#admin.site.urls 该模块定义了可在管理网站中请求的所有URL
path('admin/', admin.site.urls),
]
我们需要包含learning_logs的URL,因此添加:
from django.contrib import admin
from django.urls import path,include
#定义变量urlpatterns
urlpatterns = [
#admin.site.urls 该模块定义了可在管理网站中请求的所有URL
path('admin/', admin.site.urls),
path('',include('learning_logs.urls')),
]
在learning_logs中添加urls.py:
'''定义learning_logs的URL模式'''
from django.urls import path
from . import views # 从当前所在文件夹中导入views.py
# app_name将urls.py文件同项目中其他应用程序中同名文件夹分开来
app_name = 'learning_logs'
urlpatterns = [
# 实际的URL模式是对函数path()的调用
path('', views.index, name='index'),
'''三个参数:第一个字符串,帮助Django正确地路由请求。
收到请求的URL后,力图将请求路由给一个视图。搜索所有URL模式,进行匹配
Django忽略项目的基础URL主页,因此空字符串''与基础URL匹配,其它URL与这个模式不匹配'''
'''第二个实参指定了调用view.py中哪个函数,请求的URL与前述正则表达式匹配时,
调用view.py中函数index()'''
'''第三个实参将URL模式名称指定为index,让我们能够在代码其它地方引用,
每当需要提供到这个主页的链接时,都将使用这个名称,而不编写URL'''
]
编写视图:
learning_logs中views.py是执行命令python manage.py startapp自动生成的
from django.shortcuts import render
# 在这里创建视图
添加为主页编写视图的代码:
from django.shortcuts import render # 根据视图提供数据渲染响应
# 视图函数
def index(request):
'''学习笔记的首页'''
return render(request, 'learning_logs/index.html')
#URL请求与定义的模式匹配时,Django将在文件view.py中查找函数index(),将对象request传递给这个视图函数
#rend()两个实参:对象request以及一个可用于创建页面的模板
编写模板:
learning_logs中新建templates文件夹,里面再新建一个文件夹learning_logs,里面新建文件index.html
Learning Log
Learning Log helps you keep track of your learning,for any topic you're learning about.
创建其他页面:
模板继承:
1.父模板:创建base.html
#创建到主页链接的段落 标签模板{% %}
#生成一个URL,与名为index的URL模式匹配。
#在本例中learnin_logs是一个命名空间,而index是该命名空间中一个名称独特的URL模式。
#这个命名空间来自于urls.py赋给app_name的值
#插入一对块标签,块名为content,是一个占位符,其中包含信息由子模板指定
#子板块并非必须定义父模块中的每个块,父模块中可以使用任意多个块来预留空间,而子模块可根据需要定义相应数量的块
{% block content %}{% endblock content %}
2.子模块:重写index.html 继承base.html:
#子模块第一行必须包括标签{% extends %},让Django知道继承哪个模块,并导入
{% extends "learning_logs/base.html" %}
#插入名为content的{% block %}的标签,以定义content块
#不是从父模板继承的内容都包含在content块中,描述项目“学习笔记”的段落
{% block content %}
Learning Log helps you keep track of your learning,for any topic you're learning about.
#指出定义内容的结束位置
{% endblock content %}
'''
模板继承的优点开始显现出来:在子模板中,只需包含当前页面特有的内容。简化了每个模板,还容易修改,要修改共有的元素,只需在父模板中修改
'''
显示所有主题的页面:
显示用户创建的所有主题,一个需要使用数据的页面
1.URL模式
定义所有主题的页面的URL,修改learning_logs/urls.py:
……
urlpatterns = [
# 实际的URL模式是对函数path()的调用
path('', views.index, name='index'),
# 显示所有的主题
path('topics/', views.topics, name='topics'),
]
这里在用于主页URL的字符串参数中添加topics/,Django检查请求的URL时,这个模式与如下URL匹配:基础URL后面跟着topics 。可在末尾包含斜杠,也可省略,但topics后面不能有任何东西。模式匹配请求都将交给views.py中函数topics()处理
2.视图:
函数topics()需要从数据库中获取一些数据,并将其交给模板。需要在views.py中添加:
from django.shortcuts import render # 根据视图提供数据渲染响应
from .models import Topic # 导入所需数据相关联的模型
# 在这里创建视图
def index(request):
'''学习笔记的首页'''
return render(request, 'learning_logs/index.html')
def topics(request): # request从服务器收到的对象
'''显示所有的主题'''
# 查询数据库——请求提供Topic对象,并根据属性date_added排序
topics = Topic.objects.order_by('date_added')
# 定义一个将发送给模板的上下文。键:访问数据名称,值:发送给模板的数据
context = {'topics': topics}
#返回 对象request 模板路径 变量context
return render(request, 'learning_logs/topics.html', context)
3.模板
显示所有主题页面模板接受字典context,以便使用topics()提供的数据。新建topics.html
{% extends "learning_logs/base.html" %} #继承
{% block content %}
Topics
- #无序列表,ul表示
- {{ topic }} #项目列表项
- No topics have been added yet.
{% for topic in topics %} #相当于for循环模板标签
{% empty %} #如果列表为空
{% endfor %} #循环结束位置
{% endblock content %}
修改父模板:
Learning_Log - #增加-连字符
{% block content %}{% endblock content %}
显示特定主题的页面:
1.URL模式learning_logs/urls.py:
urlpatterns = [
# 实际的URL模式是对函数path()的调用
path('', views.index, name='index'),
# 显示所有的主题
path('topics/', views.topics, name='topics'),
# 特定主题的详细页面
path('topics/
]
'''
'topics/
/
发现URL与这个模式匹配时,Django将调用视图函数topic(),并将存储在topic_id中的值作为实参传递给它
在这个函数中,将使用topic_id的值来获取相应的主题
'''
2.视图
函数topic()需要从数据库中获取指定的主题以及与之相关联的所有条目:views.py
def topic(request, topic_id): # 接受id捕获的值
topic = Topic.objects.get(id=topic_id) # 获取指定的主题
entities = topic.entry_set.order_by('-date_added') # 获取相关联的条目、并排序
context = {'topic': topic, 'entities': entities} # 主题、条目存储在字典
# 发送给模板topic.html
return render(request, 'learning_logs/topic.html', context)
3.模板topic.html
{% extends "learning_logs/base.html" %}
{% block content %}
Topic:{{ topic }}
#显示当前主题
Entries:
-
{{ entry.date_added|date:'M d, Y H:i' }}
#条目时间戳 |模板过滤器 以''形式显示{{ entry.text|linebreaks }}
#完整的文本 - There are no entries for this topic yet.
{% for entry in entries %} #项目列表遍历
{% empty %}
{% endfor %}
{% endblock content %}
4.将显示所有主题的页面设置为链接 topics.html:
{% for topic in topics %}
{% empty %}