003_创建页面
/* 一: 创建主页 1 映射URL 2 编写URL 3 编写视图 4 编写模板 5 网页查看 6 完整项目 二: 其他页面 1 模板继承 (1) 父模板 (2) 子模板 2 显示所有主题 (1) URL (2) 视图 (3) 模板 (4) 修改父模板 (5) 页面显示 (6) 完整项目 3 显示特定主题页面 (1) URL (2) 视图 (3) 模板 (4) 修改主题页 (5) Error - UnicodeDecodeError: 'gbk' codec can't decode (6) Error - TemplateSyntaxError at /topics/ (7) 页面显示 (8) 完整项目 */
/* 创建页面: URL, 视图, 模板 */
一: 创建主页
1 映射URL
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
from django.contrib import admin from django.urls import path, include urlpatterns = [ path('admin/', admin.site.urls), path('', include('learning_logs.urls')), ] ''' path('admin/', admin.site.urls): 这行代码定义了一个URL路由规则。它的意思是当用户访问'admin/'这个URL时, Django会跳转到admin.site.urls所指定的视图函数。admin.site.urls是Django admin站点的所有URL路由规则。 path('', include('learning_logs.urls')): 这行代码也定义了一个URL路由规则。 ''表示的是网站的根URL(比如http://www.example.com/)。 include('learning_logs.urls')表示将这个URL路由到learning_logs这个应用的urls.py文件中定义的URL规则。 换句话说,这行代码的意思是,当用户访问网站的根URL时,Django会查找learning_logs.urls中定义的URL规则,然后根据这些规则跳转到对应的视图函数。 '''
2 编写URL
1 创建文件: 在learning_logs 文件夹中创建 url.py
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
''' 定义learnging_logs的URL模式''' from django.urls import path from . import views app_name = 'learning_logs' urlpatterns = [ # 定义主页 path('', views.index, name='index'), ] ''' from django.urls import path:这是导入Django的path函数,它用于定义URL模式。 from . import views:这是导入当前目录(也就是learning_logs应用目录)下的views.py模块。 app_name = 'learning_logs':这是定义当前应用的名称,主要用于URL的反向解析。 ''' ''' urlpatterns = [...]:这是定义URL模式的列表。其中每个元素都是一个URL模式。 1 ' ':这个字符串定义了URL模式。''表示根目录,也就是说,如果用户访问http://你的网站/,那么Django就会将这个请求映射到views.index视图函数。 2 views.index:这是你在views.py中定义的一个视图函数。当用户访问匹配当前URL模式的地址时,Django就会调用这个视图函数处理请求。 3 name='index':这是给这个URL模式定义的名称,主要用于URL的反向解析。例如,你可以在模板中使用{% url 'learning_logs:index' %}来生成一个指向这个URL的链接。 '''
3 编写视图
from django.shortcuts import render def index(request): ''' 学习笔记的主页 ''' return render(request, "learning_logs/index.html")
4 编写模板
1 创建目录: templates - learning_logs
2 创建文件: index.html
<p>Learning Log</p> <p>Learning Log helps you keep track of your learning, for any topic you're learning about.</p>
5 网页查看
1 输入地址: http://127.0.0.1:8000
6 完整项目
压缩包: 链接
二: 其他页面
1 模板继承
(1) 父模板
<p> <a href="{% url 'learning_logs:index' %}">Learning Log</a> - </p> {% block content %} {% endblock content %}
1 创建文件: 在learning_logs文件夹内创建 base.html
(2) 子模板
{% 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 %}
1 创建文件: 在learning_logs文件夹内修改 index.html文件的内容。
''' 1 父模板:这是一个基础模板,它定义了一个网页的基本结构。在你的例子中,父模板定义了一个链接和一个名为content的块(block)。这个块是一个占位符,它的内容将在子模板中被填充。 2 子模板:子模板继承了父模板,并填充了父模板中定义的块。在你的例子中,子模板填充了content块,添加了一段描述文本。 好处: 你可以定义一个通用的父模板,然后通过创建多个子模板来创建不同的页面,而不需要重复编写相同的代码。这样可以提高代码的复用性,使代码更加整洁和易于维护。 Django渲染子模板时,它会首先加载父模板,然后在content块的位置插入子模板中定义的内容,最后生成一个完整的HTML页面。 '''
2 显示所有主题
(1) URL
# urls.py urlpatterns = [ # 定义主页 path('', views.index, name='index'), # 显示所有的主题页面 path('topics/', views.topics, name='topics'), ]
(2) 视图
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
# views.py from .models import Topic def topics(request): ''' 显示所有的主题 ''' topics = Topic.objects.order_by('date_added') context = {'topics':topics} return render(request, 'learning_logs/topics.html', context)
(3) 模板
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
{% 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 %}
1 创建文件: 在learning_logs文件夹内创建 topics.html
(4) 修改父模板
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
<p> <a href="{% url 'learning_logs:index' %}">Learning Log</a> - <a href="{% url 'learning_logs:topics' %}">Topics</a> </p> {% block content %} {% endblock content %}
1 添加链接: topics
(5) 页面显示
1 : 输入地址: http://127.0.0.1:8000/topics/
(6) 完整项目
压缩包: django_其他页面
3 显示特定主题页面
(1) URL
# urls.py urlpatterns = [ # 特定主题的详细页面 path('topics/<int:topic_id>/', views.topic, name='topic'), ]
(2) 视图
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
# views.py 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)
(3) 模板
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
{% 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 %}
1 创建文件: 在learning_logs文件夹内创建 topic.html
(4) 修改主题页
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
{% extends "learning_logs/base.html" %} {% block content %} <p>Topics</p> <ul> {% for topic in topics %} <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 %}
1 修改文件: topics.html
(5) Error - UnicodeDecodeError: 'gbk' codec can't decode
''' 解决 1 打开文件: django\views\debug.py 2 定位内容: 约332行, with Path(CURRENT_DIR, 'templates', 'technical_500.html').open() as fh: 3 修改内容: 约332行, with Path(CURRENT_DIR, 'templates', 'technical_500.html').open(encoding='utf-8') as fh: '''
(6) Error - TemplateSyntaxError at /topics/
''' 解决 1 打开文件: 对应的html文件 2 删除注释 '''
(7) 页面显示
1 : 输入地址: http://127.0.0.1:8000/topics/
1 : 输入地址: http://127.0.0.1:8000/topics/1/
1 : 输入地址: http://127.0.0.1:8000/topics/2/
(8) 完整项目
压缩包: 链接