【发布时间】:2011-06-25 13:28:41
【问题描述】:
我想制作一个表单,一旦提交,在为同一用户下一次呈现表单时,表单将已经填写用户上次提交时的数据。听起来像是 django 应该有快捷方式的东西 - 它有吗?如果不是,最简单的方法是什么?
我能想到的最好的办法是腌制cleaned_data 并将其保存为 cookie,稍后再从中重新创建表单。
【问题讨论】:
标签: django forms cookies state restore
我想制作一个表单,一旦提交,在为同一用户下一次呈现表单时,表单将已经填写用户上次提交时的数据。听起来像是 django 应该有快捷方式的东西 - 它有吗?如果不是,最简单的方法是什么?
我能想到的最好的办法是腌制cleaned_data 并将其保存为 cookie,稍后再从中重新创建表单。
【问题讨论】:
标签: django forms cookies state restore
这听起来已经是一个不错的计划了。但如果使用 cookie 没有压力,我会求助于使用会话。这样您就不会达到 cookie 的大小限制,并且传输较大大小的 cookie 会减慢您的响应时间。
form = MyForm(initial=request.session.get('form_data'))
...
if form.is_valid():
request.session['form_data'] = form.cleaned_data
【讨论】:
form = MyForm(request.session.get('form_data')。使用首字母使表单不受限制,即使没有错误,form.is_valid() 也始终返回 False。表单必须绑定到数据才能使用 'is_valid()' 方法。
TypeError: Object of type 'date' is not JSON serializable。您可以使用:form_data = json.dumps(list(form.cleaned_data),cls=DjangoJSONEncoder)
作为对此的扩展,我发现了一种使用会话通过基于类的视图保存表单数据的方法:
from django.views.generic.edit import FormView
class MyFormView(FormView):
template_name = 'myform.html'
form_class = MyForm
success_url = '/success/'
def get_form_kwargs(self):
"""
The FormMixin uses this to populate the data from the POST request.
Here, first try to populate it from the session data, if any;
if there is POST data, it should override the session data.
"""
kwargs = {'data': self.request.session.get('form_data', None)}
kwargs.update(super(MyFormView, self).get_form_kwargs())
return kwargs
def form_valid(self, form):
...
# save the form data to the session so it comes up as default next time
self.request.session['form_data'] = form.cleaned_data
...
【讨论】: