python Web应用程序2 2021-03-03

创建页面:学习笔记主页

三个阶段:定义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的值

    Learning_Log

#插入一对块标签,块名为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表示

            {% for topic in topics %}   #相当于for循环模板标签

                

  • {{ topic }}
  •     #项目列表项

            {% empty %} #如果列表为空

                

  • No topics have been added yet.
  •         {% endfor %}    #循环结束位置

        

    {% endblock content %}


修改父模板:

    Learning_Log -        #增加-连字符

    Topics

{% 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//', views.topic, name='topic'),

]

'''

'topics//'    topics:查找在基础URL后包含单词topics的URL

//    与包含让两个斜杠内的整数匹配,并将这个整数存储在一个名为topic_id的实参中

发现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:

    

        {% for entry in entries %}    #项目列表遍历

            

  •             

    {{ entry.date_added|date:'M d, Y H:i' }}

        #条目时间戳    |模板过滤器 以''形式显示

                

    {{ entry.text|linebreaks }}

        #完整的文本

            

  •         {% empty %}

                

  • There are no entries for this topic yet.
  •         {% endfor %}

        

    {% endblock content %}


4.将显示所有主题的页面设置为链接 topics.html:

        {% for topic in topics %}

            

  •                 {{ topic }}

                

  •         {% empty %}



    你可能感兴趣的:(python Web应用程序2 2021-03-03)