Python 从0开始 一步步基于Django创建项目(6)实现一个简易网站

本文实现一个简易的网站,包含三个网页:

1)主页

2)城市列表页

3)指定城市信息页

城市、城市信息可以通过Admin site通过管理员账户向数据库中录入。

实现本文功能,需要新建的文件一共7个,其名称及路径如下(如果项目根目录是**.\snap_gram**):

1 .\snap_gram\snap_gram路径下的urls.py文件

python 复制代码
from django.contrib import admin
from django.urls import path,include

urlpatterns = [
    path('admin/', admin.site.urls),
    path('',include('city_infos.urls')),
]

在urlpatterns中注册了两个url。第一个是当浏览器输入127.0.0.1:8000/admin/时,导航至Admin Site。第二个是当浏览器输入127.0.0.1:8000时,到文件city_infos.urls中查找url信息。

2 .\snap_gram\city_infos路径下的urls.py文件

该urls.py文件,被上一步的urls.py包含。

python 复制代码
from django.urls import path
from .import views

app_name = 'city_infos'
urlpatterns=[
    path('',views.index,name='index'),
    path('cities/',views.cities,name='cities'),
    path('cities/<int:city_id>/',views.city,name='city'),
]

对应本网站的三个网页,在urlpatterns中注册三个url。

(1)当浏览器输入127.0.0.1:8000,调用视图文件views.py中的函数函数index,该url命名为'index'

(2)当浏览器输入127.0.0.1:8000/cities/,调用视图文件views.py中的函数函数cities,该url命名为'cities'

(3) 当浏览器输入127.0.0.1:8000/cities/1/,调用视图文件views.py中的函数函数city,该url命名为'city'。注意此处的1,代表城市ID,会根据点选城市发生变化。

3 .\snap_gram\city_infos路径下的views.py文件

该文件就是上面提到的'视图文件'。

python 复制代码
from django.shortcuts import render
from .models import City

# Create your views here.
def index(request):
    return render(request,'city_infos/index.html')

def cities(request):
    cities = City.objects.order_by('date_added')
    context = {'cities':cities}
    return render(request,'city_infos/cities.html',context)

def city(request,city_id):
    city = City.objects.get(id=city_id)
    entries = city.entry_set.order_by('date_added')
    context = {'city':city,
               'entries':entries}
    return render(request,'city_infos/city.html',context)

(1)函数index,渲染页面index.html

(2)函数cities,渲染页面cities.html,页面所需的数据保存在字典context中。context中的信息,通过语句City.objects.order_by('date_added')从数据库中查询得到,查询结果按date_added排序。

(3)函数city,渲染页面city.html,页面所需的数据保存在字典context中。context中的city信息,通过语句City.objects.get(id=city_id)从数据库中查询得到;congtext中的entries信息,通过语句city.entry_set.order_by('date_added')从数据库中查询得到。

与前两个函数不同之处在于,函数city需要输入参数'city_id'以获得具体city,从而获得与该city关联的entry信息。该'city_id'就是urls.py文件中,path('cities/<int:city_id>/',views.city,name='city')语句中的<int:city_id>。

4 .\snap_gram\city_infos\templates\city_infos路径下的base.html文件

该文件是所有网页模板文件的父模板,被其他模板文件继承。

html 复制代码
<p>
    <a href="{% url 'city_infos:index'%}">City Info</a>-
    <a href="{% url 'city_infos:cities'%}">Cities</a>
</p>

{% block content %}{% endblock content %}

模板标签{% url 'city_infos:index'%}生成一个URL,该URL与在city_infos/urls.py中定义的名为'index'的URL模式匹配。

City Info链接到这个URL。

5 .\snap_gram\city_infos\templates\city_infos路径下的index.html文件

html 复制代码
{% extends "city_infos/base.html" %}

{% block content %}
<p>这是一个关于城市的网站.</p>
{% endblock content %}

该网页模板继承base.html模板,显示一条简单信息。

6 .\snap_gram\city_infos\templates\city_infos路径下的cities.html文件

html 复制代码
{% extends "city_infos/base.html" %}

{% block content %}

    <p>Cities</p>

    <ul>
        {% for city in cities %}
            <li>
                <a href="{% url 'city_infos:city' city.id %}">{{ city }}</a>
            </li>
        {% empty %}
            <li>No topics have been added yet.</li>
        {% endfor %}
    </ul>

{% endblock content %}

该模板所需的cities信息,由'视图文件views.py'中的cities函数提供。

在为每个city生成的url链接中,加入了city.id信息,该信息将传递给views文件中的city函数,用于提取关于城市的具体信息。

7 .\snap_gram\city_infos\templates\city_infos路径下的city.html文件

html 复制代码
{% extends 'city_infos/base.html'%}

{% block content %}

    <p>City:{{ city }}</p>

    <p>Infos:</p>
    <ul>
        {% for entry in entries %}
            <li>
                <p>{{ entry.date_added|date:'M d,Y H:i'}}</p>
                <p>{{ entry.info|linebreaks }}</p>
            </li>
        {% empty %}
            <li>该城市下未添加信息。</li>
        {% endfor %}
    </ul>

{% endblock content %}

该模板所需的city、entries信息,由'视图文件views.py'中的city函数提供。

以上文件编辑完成后,需要进入虚拟环境,并启动Django服务器。

运行效果:

1)主页

2)城市列表页

3)指定城市信息页

相关推荐
城管不管1 小时前
重生——第十一次面试之挖财一面2026.8.19已OC
java·服务器·jvm·数据库·spring·面试·职场和发展
倔强的石头1062 小时前
向量数据库从相似度检索走向融合数据底座
数据库
聪明蛋子哟2 小时前
Stagehand v3多语言SDK:Python/Go/Rust/Java下的浏览器自动化统一方案
python·golang·rust
今天AI了吗3 小时前
Python 基础语法(一):常量、变量、输入输出与运算符
开发语言·数据库·人工智能·python·sql·深度学习·机器学习
卷无止境3 小时前
Windows 上丝滑开发 Python,并稳定构建 Docker 镜像
后端·python·docker
TELL5213 小时前
selenium webdriver 第二次初始化的异常
开发语言·python
Csvn4 小时前
🐍 Day 4: Python 控制流 — 条件、循环与推导式的艺术
后端·python
lilian2334 小时前
Harmony os 技术实战|拼豆制图27:用单字符编码承载 50 张 70×70 图纸
前端·数据库·华为·harmonyos
皮卡丘不断更4 小时前
手机优先的 Personal Ledger:把账目、学习和复盘放到同一个入口
数据库·sqlite·fastapi·开源项目·个人效率
保卫大狮兄5 小时前
设备管理从台账到报废,完整生命周期一次讲清
数据库·设备管理·设备