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

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规则,然后根据这些规则跳转到对应的视图函数。
'''
View Code

 

  2 编写URL

1 创建文件: 在learning_logs 文件夹中创建 url.py

''' 定义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的链接。
'''
View Code

 

  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) 视图

# 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)
View Code

 

     (3) 模板

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

1 创建文件: 在learning_logs文件夹内创建 topics.html

 

      (4) 修改父模板

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

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

{% block content %} {% endblock content %}
View Code

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) 视图
# 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)
View Code

        (3) 模板 
{% 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 %}
View Code

1 创建文件: 在learning_logs文件夹内创建 topic.html

 

        (4) 修改主题页
{% 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 %}
View Code

 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) 完整项目

        压缩包: 链接

 

posted @ 2023-06-05 16:27  火焰马  阅读(5)  评论(0编辑  收藏  举报