Python中Django如何实现分多次提交一个表单?

近期学习 Django,想要使用 Django 造一个 Feed43 的轮子练手,经常使用 RSS 阅读的人应该知道,这是一个制作 RSS 的网站。

Feed43 在制作 RSS 时的填入表单页面拥有多个字段,一共需要提交三次,第一次提交一个网址返回页面源码,第二次提交搜索规则返回页面中提取的项目,第三次提交剩下的并包括之前的字段,保存所有内容完成了一个 feed 制作。

feed43 是使用 JS 完成这样的功能,然而我在学习 Django 时已经不可避免的额外学习了其他的相关知识,已经没有时间精力能力再学习 JS 了。

是否有其他方式可以在一个页面,多次只提交一个或多个表单并保存。对 Django 和前端所知甚少,这个问题想了很多也无从下手,提问问题时也受制于我的无知不能更精确专业的描述,真心希望能得到前辈指点,给几个关键词,有个解决问题的方向。
Python中Django如何实现分多次提交一个表单?


5 回复

在Django里分多次提交一个表单,通常叫“多步表单”或“向导表单”。最直接的办法是用django-formtools这个第三方库,它提供了FormWizardView。下面是一个简单的例子。

首先,安装它:

pip install django-formtools

然后,在你的views.py里定义几个表单步骤和一个视图:

# myapp/views.py
from django import forms
from formtools.wizard.views import SessionWizardView

# 第一步的表单
class ContactForm1(forms.Form):
    subject = forms.CharField(max_length=100)
    sender = forms.EmailField()

# 第二步的表单
class ContactForm2(forms.Form):
    message = forms.CharField(widget=forms.Textarea)

# 使用SessionWizardView创建向导视图
class ContactWizard(SessionWizardView):
    template_name = 'myapp/contact_form.html' # 你的模板路径
    form_list = [ContactForm1, ContactForm2]

    def done(self, form_list, **kwargs):
        # 这个方法在所有步骤完成后被调用
        # form_list 包含了所有步骤表单实例的列表
        form_data = [form.cleaned_data for form in form_list]
        # 这里处理你的数据,比如保存到数据库
        # 例如:process_data(form_data)
        return render(self.request, 'myapp/done.html', {'form_data': form_data})

在你的urls.py里配置这个视图:

# myapp/urls.py
from django.urls import path
from .views import ContactWizard

urlpatterns = [
    path('contact/', ContactWizard.as_view(), name='contact_wizard'),
]

最后,你需要一个模板(比如myapp/contact_form.html)来渲染表单。formtools会自动处理步骤逻辑,你只需要用{{ wizard.form }}渲染当前步骤的表单,并用{{ wizard.management_form }}包含必要的隐藏字段。

核心就是django-formtoolsWizardView帮你管理了会话和步骤状态。每个步骤的数据会临时存在session里,直到最后一步你可以在done方法里一次性处理所有数据。

总结:用django-formtoolsWizardView最省事。

如果不用 JS 的话,那就 iFrame 吧。

花点时间看看 jquery 吧,不用去看 js,花不了多长时间的

有个 model_form_factory 可以查查文档,多个 form

回到顶部