Python+Django(2)——创建主页、创建其他网页

本文介绍了使用Django框架进行项目开发时,如何进行模板继承以实现页面的通用布局。通过修改urls.py文件配置URL模式,创建视图函数处理HTTP请求,并编写HTML模板展示内容。此外,还展示了如何创建多个网页,如主页、主题列表页和特定主题详情页,以及在模板中使用URL标签链接各个页面。
摘要由CSDN通过智能技术生成

模板继承 :笔记来源《Python编程:从入门到实践》[美] Eric Matthes,袁国忠译

一、创建主页

打开项目主文件夹learning_log中的文件urls.py:

from django.contrib import admin
from django.urls import path,re_path as url,include

urlpatterns = [
    path('admin/', admin.site.urls),
    #将learning_logs 的URL同项目中的其他URL区分开来
    url(r'', include(('learning_logs.urls','learning_logs'), namespace='learning_logs')),
]

Django 2.0:

  1. path:带regex的路由,对于复杂的regex调用,可以使用re_path
  2. django.urls中include函数第一个参数传入的是tuple类型,另一个是参数是app_name(必填)

在learning_logs中新建urls.py:

"""定义learning_logs的URL模式"""
from django.urls import re_path as url
# 让Python从当前的urls.py模块所在的文件夹中导入视图
from . import views

urlpatterns = {
# 我们来看看正则表达式r'^$' 。其中的r 让Python将接下来的字符串视为原始字符串,而引号告诉Python正则表达式始于和终于何处。脱字符(^ )让Python查看字符串的开头,
# 而美元符号让Python查看字符串的末尾。总体而言,这个正则表达式让Python查找开头和末尾之间没有任何东西的URL。Python忽略项目的基础URL(http://localhost:8000/),因此这
# 个正则表达式与基础URL匹配。其他URL都与这个正则表达式不匹配。如果请求的URL不与任何URL模式匹配,Django将返回一个错误页面。
    url(r'^$',views.index,name="index"),
}

编写视图:

  打开learning_logs中的views.py:
from django.shortcuts import render

# Create your views here.
def index(request):
    """学习笔记的主页"""
    return render(request,'learning_logs/index.html')
        Django将在文件views.py中查找函数index(),index()向函数render() 提供了两个实参:原始请求对象以及一个可用于创建网页的模板

编写模板:

  在文件夹learning_logs中创建了文件夹templates,在templates文件夹中创建文件夹learning_logs(建立了Django能够明确解读的结构),新建一个文件,并将其命名为index.html:

<p>Learning Log</p>
<p>
  Learning Log helps you keep track of your learning, for any topic you're
  learning about.
</p>

        浏览器打开http://localhost:8000/

二、创建其他网页

1,修改主页

        父模板:抽取通用元素,在index.html同级目录下新建base.html

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

        模板标签用大括号和百分号 {% %} 表示,在这个实例中,模板标签{% url 'learning_logs:index' %} 生成一个URL,该URL与learning_logs/urls.py中定义的名为index 的URL模式匹配。在这个示例中,learning_logs 是一个命名空间,而index 是该命名空间中一个名称独特的URL模式。

        子模板:index.html继承base.html

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

        子模板的第一行必须包含标签{% extends %},base.html在learning_logs文件夹中,因此父模板路径中包含learning_logs。

        {% block %} 标签定义content 块,{% endblock content %} 指出了内容定义的结束位置。

打开http://localhost:8000/,报错django 'set' object is not reversible,如下:

解决办法:urls.py中将大括号修改为中括号(字典是无序的,所以报错不能逆转)

2,增加一个主题列表页面

        打开urls.py

urlpatterns = [
    url(r'^$',views.index,name="index"),
    # 显示所有的主题
    url(r'^topics/$', views.topics, name='topics'),
]

        在views.py新增topics函数

from django.shortcuts import render
from .models import Topic

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

def topics(request):
    """显示所有的主题"""
    topics = Topic.objects.order_by('date_added')
    context = {'topics': topics}
    return render(request, 'learning_logs/topics.html', context)

        在index.html同级目录下新建topic.html

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

        修改base.html 

<p>
    <a href="{% url 'learning_logs:index' %}">Learning Log</a>
    <a href="{% url 'learning_logs:topics' %}">Topics</a>
</p>
{% block content %}{% endblock content %}

        打开http://localhost:8000/

  点击Topic:

 3,显示特定主题

        urls.py

"""定义learning_logs的URL模式"""
from django.urls import re_path as url
# 让Python从当前的urls.py模块所在的文件夹中导入视图
from . import views

urlpatterns = [
    url(r'^$', views.index, name="index"),
    # 显示所有的主题
    url(r'^topics/$', views.topics, name='topics'),
    # 特定主题的详细页面
    url(r'^topics/(?P<topic_id>\d+)/$', views.topic, name='topic'),
]

        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)

        新建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:'Y M d, H:i' }}</p>
    <p>{{ entry.text|linebreaks }}</p>
  </li>
  {% empty %}
  <li>There are no entries for this topic yet.</li>
  {% endfor %}
</ul>
{% endblock content %}

        打开topics.html,将每个主题加上链接

  <li>
    <a href="{% url 'learning_logs:topic' topic.id %}">{{topic}}</a>
  </li>

        打开http://localhost:8000/,点击Topic,点击某个主题:

总结

        模板继承:编写一个包含通用元素的父模板,并让每个网页都继承这个模板,而不必在每个网页中重复定义。

好的,下面是Python中使用Django进行通讯录制作的步骤: 1. 创建Django项目 使用以下命令创建Django项目: ``` django-admin startproject myaddressbook ``` 2. 创建Django应用 使用以下命令创建Django应用: ``` python manage.py startapp contacts ``` 3. 配置数据库 打开myaddressbook/settings.py文件,配置数据库: ```python DATABASES = { 'default': { 'ENGINE': 'django.db.backends.sqlite3', 'NAME': BASE_DIR / 'db.sqlite3', } } ``` 这里我们使用sqlite3数据库,如果你想使用其他数据库,需要在此处进行相应的配置。 4. 创建模型 在contacts/models.py文件中定义Contact模型: ```python from django.db import models class Contact(models.Model): first_name = models.CharField(max_length=30) last_name = models.CharField(max_length=30) email = models.EmailField() phone = models.CharField(max_length=20) def __str__(self): return f'{self.first_name} {self.last_name}' ``` 5. 迁移数据库 运行以下命令迁移数据库: ``` python manage.py makemigrations python manage.py migrate ``` 6. 创建视图 在contacts/views.py文件中创建ContactListView视图: ```python from django.views.generic import ListView from .models import Contact class ContactListView(ListView): model = Contact ``` 7. 创建URL 在myaddressbook/urls.py文件中创建URL: ```python from django.urls import path from contacts.views import ContactListView urlpatterns = [ path('', ContactListView.as_view(), name='contact_list'), ] ``` 8. 运行服务器 使用以下命令运行Django服务器: ``` python manage.py runserver ``` 现在你可以在浏览器中访问http://127.0.0.1:8000/,就可以看到通讯录列表了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值