Django学习笔记04

  • Post author:
  • Post category:其他


4. 创建其他页面

创建两个显示数据的页面,一个列出所有的主题,一个显示特定主题的所有条目。

4-1 模板继承


父模板

包含通用元素,每个页面都将继承这个模板。

base.html

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

{% block content %}{% endblock content %}  <!--块标签,是一个占位符;块名为content-->

{% %}模板标签

learning_logs是一个

命名空间

,index是该

命名空间

中一个名称独特的URL模式。




标签定义链接<a href=”link_url”>link text</a>


子模板

index.heml

{% 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 %}

4-2 显示所有主题的页面


URL模式

learning_logs/urls.py

"""定义learning_logs的URL模式"""
from django.urls import path

from . import views	# 句点让Python从当前urls.py模块所在的文件夹导入views.py

app_name = 'learning_logs' #区分其他应用程序中的同名文件
urlpatterns = [
	# 主页
	path('', views.index, name='index'),
	# 显示所有的主题
	path('topics/', views.topics, name='topics'),
]

添加了topics/


视图

函数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):
	"""显示所有的主题"""
	topics = Topic.objects.order_by('date_added') # 查询数据库————请求提供Topic对象,并根据属性date_added进行排序
	comtext = {'topics':topics}		# 定义一个将发送给模板的上下文
	return render(request, 'learning_logs/topics.html', comtext)


上下文

(context)是一个字典,键:将在模板中用来访问数据名称。值:要发送给模板的数据。


模板

接受字典context,以便使用topic()提供的数据。

topics.html

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

{% block content %}

  <p>Topics</p>

  <ul>
  	{% for topic in topics %}	<!--for循环-->
  	  <li>{{ topic }}</li>
  	{% empty %}		<!--列表为空时-->
  	  <li>No topics have been added yet</li>
  	{% endfor %}	
  </ul>

  {% endblock content %}

<ul></ul>

无序列表

for循环遍历字典context中的列表topics。

{

{ topic }}

模板变量

,打印变量值。

<li></li>

项目列表项


修改父模板

base.html

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

{% block content %}{% endblock content %}  <!--块标签,是一个占位符;块名为content-->

‘-‘

连字符

4-3 显示特定主题的页面


URL模式

使用主题的id属性来指出请求的是哪个主题。

learning_logs/urls.py

"""定义learning_logs的URL模式"""
from django.urls import path

from . import views	# 句点让Python从当前urls.py模块所在的文件夹导入views.py

app_name = 'learning_logs' #区分其他应用程序中的同名文件
urlpatterns = [
	# 主页
	path('', views.index, name='index'),
	# 显示所有的主题
	path('topics/', views.topics, name='topics'),
	# 特定主题的详细页面
	path('topics/<int:topic_id>/', views.topic, name='topic'),
]

字符串’topics/<int:topic_id>/’:

第一部分查找在基础URL后包含单词topics的URL;

第二部分(/<int:topic_id>/)与包含在两个斜杠内的整数匹配。


视图

topic()需要从数据库中获取指定的主题以及与之相关联的所有条目。

views.py

from django.shortcuts import render

from .models import Topic  # 导入模型

def index(request):
	"""学习笔记的主页"""
	return render(request, 'learning_logs/index.html')

def topics(request):
	"""显示所有的主题"""
	topics = Topic.objects.order_by('date_added') # 查询数据库————请求提供Topic对象,并根据属性date_added进行排序
	comtext = {'topics':topics}		# 定义一个将发送给模板的上下文
	return render(request, 'learning_logs/topics.html', comtext)

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)

topic()的参数topic_id,接受表达式/<int:topic_id>/捕获的值。

get()获取指定的主题。-date_added按时间降序(先显示最近的)。


模板

需要显示主题名称和条目内容,如没有任何条目将给出提示。

topic.html

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

{% block content %}

  <p>Topic: {{ topic }}</p>

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

竖线( |  )表示模板

过滤器

,即对模板变量的值进行修改的函数。

date:’M d, Y H:i’  时间格式。(例如:January 1,2008 23:00)

linebreaks   将包含换行符的

长条目

转换为浏览器能够理解的格式,以免显示为不间断的文本块。


将显示所有的主题页面中的主题设置为链接

在浏览器中查看显示特定主题的页面前,需修改模板topics.html。让每个主题都链接到相应的页面。

topics.html

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

{% block content %}

  <p>Topics</p>

  <ul>
  	{% for topic in topics %}	<!--for循环-->
  	  <li>
        <a href="{% url 'learning_logs:topic' topic.id %}">{{ topic }}<a>
      </li>
  	{% empty %}		<!--列表为空时-->
  	  <li>No topics have been added yet</li>
  	{% endfor %}	
  </ul>

  {% endblock content %}

修改前:

修改后:



版权声明:本文为qq_44134242原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。