Django: FormView: 如何在刷新后保持表单值?

2 投票
2 回答
2768 浏览
提问于 2025-04-18 05:43

我有一个表单视图,内容如下:

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 中做到这一点。谢谢!

2 个回答

0

当你进行重定向时,所有的提交数据都会丢失,这跟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 方法里进行。

0

我会通过使用cookie来存储值,每次当一个元素失去焦点时,就更新这个cookie的值。

然后,如果表单提交失败,服务器会把一个叫做'valid-submission'的cookie设置为false。如果页面刷新了,一个JavaScript函数会检查这个valid-submission的设置,如果是false,就会把之前填写的内容重新填回去。否则,服务器会删除这个cookie的设置。

撰写回答