【问题标题】:Django: FormView: How to retain form values after refresh?Django:FormView:刷新后如何保留表单值?
【发布时间】:2014-05-07 19:48:32
【问题描述】:

我有一个 FormView 如下:

class SignUpView(FormView):
   template_name = '/accounts/signup.html'
   form_class = SignUpForm

   def get_context_data(self, **kwargs):
      context = super(SignUpView, self).get_context_data(**kwargs)
      # code..
      return context

   def get_initial(self):
      initial = super( SignUpView, self ).get_initial()
      # code..
      initial = {
         'email':      email,
         'dob_mm':     dob_mm,
         'dob_dd':     dob_mm,
         'dob_yyyy':   dob_yyyy,
         'email_conf': "",
         'password':   "",
      }
      return intial

   def form_valid(self, form):
      # hit external APIs to validate, charge card, etc.
      # if any errors from APIs, return to SignUp form
      messages.error( self.request, errors )
      return redirect('/account/signup/')

此时,如果页面被重新加载(由于任何错误),表单将重新初始化为空白,除了我在 get_initial() 中准备的一些字段。有什么方法可以自动保留输入字段,还是我必须手动存储它们,检测到由于错误而刷新,然后在 get_initial() 中手动设置所有字段?

我找不到任何可以描述如何使用 FormView 进行操作的帖子或文档。谢谢!

【问题讨论】:

  • 为什么不实施客户端验证来过滤掉大部分无效字段条目?如果存在无效条目,您可以禁用提交按钮,然后依靠服务器端验证进行最终处理。
  • 我这样做。我所指的错误可能来自外部 API——例如用户已经在场,付款不成功,等等——所以我无法从客户端检查这些..

标签: python django forms


【解决方案1】:

我会通过 cookie 实现值存储,每次发生模糊事件时,刚刚失去焦点的元素都会更新 cookie 值。

然后,如果表单提交失败,服务器会将“有效提交”cookie 设置为false。如果页面刷新,javascript 函数会检查 valid-submission 设置,如果为 false,则重新填充字段。否则,服务器将删除 cookie 设置。

【讨论】:

  • 想到了类似的东西,但只是好奇 Django 是否有内置的东西。谢谢!
【解决方案2】:

在进行重定向时您会丢失所有发布数据,这与 Django 无关。如果遇到任何错误,您应该只呈现页面,而不是进行重定向:

class SignUpView(FormView):
    ...

    def form_valid(self, form):
        # check for errors
        if errors:
            return self.render_to_response(self.get_context_data(form=form, errors=errors))
        return redirect(self.get_success_url())

更好的是保持逻辑正确分离,并在表单类本身中进行错误检查,无论是在单个字段的 clean_<field> 方法中,还是在整个表单的 clean 方法中。

【讨论】:

    猜你喜欢
    • 2010-11-04
    • 2011-06-29
    • 2010-11-11
    • 1970-01-01
    • 1970-01-01
    • 2015-10-26
    • 2021-03-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多