【问题标题】:Django: Save and restore a form's state using a cookieDjango:使用 cookie 保存和恢复表单的状态
【发布时间】:2011-06-25 13:28:41
【问题描述】:

我想制作一个表单,一旦提交,在为同一用户下一次呈现表单时,表单将已经填写用户上次提交时的数据。听起来像是 django 应该有快捷方式的东西 - 它有吗?如果不是,最简单的方法是什么?

我能想到的最好的办法是腌制cleaned_data 并将其保存为 cookie,稍后再从中重新创建表单。

【问题讨论】:

    标签: django forms cookies state restore


    【解决方案1】:

    这听起来已经是一个不错的计划了。但如果使用 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)
    【解决方案2】:

    作为对此的扩展,我发现了一种使用会话通过基于类的视图保存表单数据的方法:

    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
            ...
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-16
      • 1970-01-01
      相关资源
      最近更新 更多