【问题标题】:How to clear form fields after a submit in Django如何在Django中提交后清除表单字段
【发布时间】:2011-08-12 00:26:29
【问题描述】:

我有这个:

def profile(request, username):
    if request.method == 'POST':
        if request.user.is_authenticated():
            new_message = Message(author = request.user)
            form = MessagesForm(request.POST, instance = new_message)
        else:
            form = MessagesForm(request.POST)
        if form.is_valid():
            form.save()
    else:
        to_user = User.objects.get(username = username)
        form = MessagesForm(initial = {'user': to_user.pk})

    return render(request, "profile.html", {
        'username': username,
        'form': form,
        'messages': messages,
    })

此表单提交消息并返回相同的页面。我的问题是提交后我再次看到我的字段充满了我的信息。提交后如何清除?

【问题讨论】:

    标签: django django-forms


    【解决方案1】:

    在保存表单而不是显示 post dict 后分配空表单

    form = EmployeeForm()
        if request.method == "POST":
            pDict = request.POST.copy() 
            form = EmployeeForm(pDict) #if not valid shows error with previous post values in corresponding field
            if form.is_valid():
                form.save()
                form = EmployeeForm() # show empty form no need to give HttpResponseRedirect()
    

    【讨论】:

    • 这应该是问题的答案
    • 实际按F5或者重新加载页面会发送之前提交的数据,而不是空白表单。所以重定向到另一个 url 是最好的出路。
    • 大多数时候重定向页面不是一个好的选择。
    【解决方案2】:

    表单提交后重定向是标准的,以防止重复。

    成功时只需返回一个重定向到您的表单。

    if form.is_valid():
        form.save()
        return http.HttpResponseRedirect('')
    

    【讨论】:

    • 如果我不能重定向怎么办? - 作为 Django-CMS 中的站点插件表单。有什么不同的方法吗?
    • @robos85,不确定您的意思。如果你不通过 django 做,那就在客户端做。
    • 我知道这是旧的。但是当我尝试使用HttpResponseRedirect('') 时,提交后我得到一个空白页。该表单已成功提交。我在 Django 1.11
    • @Valachio 你是不是不小心返回了HttpResponse('')(一个空白页?)另外,确保你插入了你想要重定向到的 URL。可能是您的 POST 处理视图严格来说是一个 post 处理程序,并且重定向到自身没有显示任何内容。返回 HttpResponseRedirect('') 会将您重定向到同一页面。
    • 在使用 Django 2.2.2 返回 HttpResponseRedirect('') 时,我得到了与 @Valachio 相同的行为。视图不仅仅是一个 POST 处理程序。
    【解决方案3】:

    在 save() 之后,您可以返回带有 MessagesForm(request.GET) 值的 'form' 键。

    return render(request, "profile.html", {
            'username': username,
            'form': MessagesForm(request.GET),
            'messages': messages,
        })
    

    【讨论】:

      【解决方案4】:

      通常您可以在保存数据后初始化相同的空表单:

      if request.method == "POST":
          rf = RegistrationForm(request.POST)
          if rf.is_valid():
              print 'Saving datas..'
              #logic to save datas
              rf = PreRegistrationForm()
              return render_to_response('registration/confirmation_required.html', {'settings': settings}, context_instance=RequestContext(request))
      

      【讨论】:

      • 实际按F5或者重新加载页面会发送之前提交的数据,而不是空白表单。所以重定向到另一个 url 是最好的出路。
      【解决方案5】:

      尝试在@Karthikkumar 的回答中使用HttpResponseRedirect('/') 而不是HttpResponseRedirect(''),特别是如果您的主视图是空路径,例如您的urls.py 文件中有:

      urlpatterns = [path('',views.home_view),]
      

      我遇到了与上面讨论的问题类似的问题,HttpResponseRedirect('') 将我引导至空白页面。让我知道添加斜线是否适合您!

      【讨论】:

        【解决方案6】:

        你可以用这个:

        Sometimes you can use this idea take attrs={ "autocomplete":"off"} for each inputs.
        

        【讨论】:

        • 不要只是添加一个答案,试着解释你的答案,让其他人理解你的解决方案
        【解决方案7】:

        您可以重定向回最初的帖子

        post_url = request.build_absolute_uri(post.get_absolute_url())
        return HttpResponseRedirect(post_url)
        

        请注意,“post”是所创建模型的一个实例

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-10-17
          • 2020-10-25
          • 1970-01-01
          • 1970-01-01
          • 2018-01-20
          • 2016-12-18
          • 2020-03-29
          • 1970-01-01
          相关资源
          最近更新 更多