Python中Django如何实现分多次提交一个表单?
近期学习 Django,想要使用 Django 造一个 Feed43 的轮子练手,经常使用 RSS 阅读的人应该知道,这是一个制作 RSS 的网站。
Feed43 在制作 RSS 时的填入表单页面拥有多个字段,一共需要提交三次,第一次提交一个网址返回页面源码,第二次提交搜索规则返回页面中提取的项目,第三次提交剩下的并包括之前的字段,保存所有内容完成了一个 feed 制作。
feed43 是使用 JS 完成这样的功能,然而我在学习 Django 时已经不可避免的额外学习了其他的相关知识,已经没有时间精力能力再学习 JS 了。
是否有其他方式可以在一个页面,多次只提交一个或多个表单并保存。对 Django 和前端所知甚少,这个问题想了很多也无从下手,提问问题时也受制于我的无知不能更精确专业的描述,真心希望能得到前辈指点,给几个关键词,有个解决问题的方向。
Python中Django如何实现分多次提交一个表单?
ajax
在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-formtools的WizardView帮你管理了会话和步骤状态。每个步骤的数据会临时存在session里,直到最后一步你可以在done方法里一次性处理所有数据。
总结:用django-formtools的WizardView最省事。
如果不用 JS 的话,那就 iFrame 吧。
花点时间看看 jquery 吧,不用去看 js,花不了多长时间的
有个 model_form_factory 可以查查文档,多个 form

