Python 从0开始 一步步基于Django创建项目(8)使用表单编辑既有条目

与《Python 从0开始 一步步基于Django创建项目(6)》中的表单应用不同。

前者,是使用表单,提交新数据,新增内容。

本文,是使用表单,对既有数据,进行修改。

因为是对既有数据进行修改,就不需要创建新的数据类,即不需要创建新的'表单类'。

本文实现的功能:

在罗列信息条目的页面,在每个信息条目下,添加一个'链接',该链接触发对特定城市的'信息条目'进行修改。

链接的URL,调用对应的view函数,由view函数显示、刷新对应的html页面。当修改完成后,从'条目编辑'页面,重定向到罗列信息条目的页面。

实施过程包括以下四个步骤:

1、修改C:\D\Python\Python310\study\snap_gram\city_infos\templates\city_infos路径下的city.html文件,在每个信息条目下,添加一个'编辑条目'链接。

这个链接中使用的url是

复制代码
city_infos:edit_entry' entry.id
html 复制代码
{% for entry in entries %}
    <li>
        <p>{{ entry.date_added|date:'M d,Y H:i'}}</p>
        <p>{{ entry.info|linebreaks }}</p>
        <p>
            <a href="{% url 'city_infos:edit_entry' entry.id %}">编辑条目</a>
        </p>
    </li>

2、修改C:\D\Python\Python310\study\snap_gram\city_infos路径下的urls.py文件,添加上一步中使用的url

python 复制代码
#更新特定条目
path('edit_entry/<int:entry_id>/',views.edit_entry,name='edit_entry'),

3、修改C:\D\Python\Python310\study\snap_gram\city_infos路径下的views.py文件,添加对应上述url的视图函数

python 复制代码
def edit_entry(request,entry_id):
    #request=GET时,返回原有Entry内容,request=POST时,提交新Entry内容
    entry = Entry.objects.get(id=entry_id)  # 找到指定的entry
    city = entry.city
    if request.method != 'POST':#初次请求,使用当前条目填充表单
        form = EntryForm(instance=entry)
    else:#处理POST提交的数据
        form = EntryForm(instance=entry, data=request.POST)
        if form.is_valid():  # Django自动检查提交数据的合法性
            form.save()
            return redirect('city_infos:city',city_id=city.id)  # 页面重定向
    context = {'entry':entry,'city': city, 'form': form}  # 程序不进入if块,或者没有通过有效性验证,都执行该行代码
    return render(request, 'city_infos/edit_entry.html', context)

通过条目id,获得指定Entry和与之对应的City。

如果是GET,那么根据条目id查询Entry信息,填写表单。

如果是POST,那么将当前表单中的信息提交,由Django自动检查提交数据的合法性。通过检查的表单数据被存储到数据库,然后将页面重定向到罗列城市信息条目的页面。

如果是GET方法,或者提交数据未通过检查,则根据Entry、City、EntryForm实例信息,生成context,并用context渲染endit_entry.html.

4、新建C:\D\Python\Python310\study\snap_gram\city_infos\templates\city_infos路径下的endit_entry.html。

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

{% block content %}
    <p><a href="{% url 'city_infos:city' city.id %}">{{ city }}</a></p>

    <p>Edit entry:</p>
    <form action="{% url 'city_infos:edit_entry' entry.id %}" method='post'>
        {% csrf_token %}
        {{ form.as_p }}
        <button name="submit">保存修改</button>
    </form>

{% endblock content %}

这个文件的内容与new_entry.html的内容极为相似,只在下面一句有区别:

html 复制代码
<form action="{% url 'city_infos:edit_entry' entry.id %}" method='post'>

在new_entry.html中使用的是city.id,因为city的id是entry的外键,通过这个id知道该条目应该隶属于那个city。

在endit_entry.html中使用的是entry.id,通过id知道修改的是哪个条目即可。

相关推荐
哦哦3312 小时前
线性回归和回归决策树(CART)对比
python·pycharm
qq7422349842 小时前
VitePress静态网站从零搭建到GitHub Pages部署一站式指南和DeepWiki:AI 驱动的下一代代码知识平台
人工智能·python·vue·github·vitepress·wiki
KD4 小时前
设计模式——责任链模式实战,优雅处理Kafka消息
后端·设计模式·kafka
陈天伟教授8 小时前
人工智能训练师认证教程(2)Python os入门教程
前端·数据库·python
2301_764441338 小时前
Aella Science Dataset Explorer 部署教程笔记
笔记·python·全文检索
爱笑的眼睛118 小时前
GraphQL:从数据查询到应用架构的范式演进
java·人工智能·python·ai
BoBoZz198 小时前
ExtractSelection 选择和提取数据集中的特定点,以及如何反转该选择
python·vtk·图形渲染·图形处理
liwulin05068 小时前
【PYTHON-YOLOV8N】如何自定义数据集
开发语言·python·yolo
木头左9 小时前
LSTM量化交易策略中时间序列预测的关键输入参数分析与Python实现
人工智能·python·lstm
电子硬件笔记9 小时前
Python语言编程导论第七章 数据结构
开发语言·数据结构·python