【问题标题】:Django forms: reload view after postDjango表单:发布后重新加载视图
【发布时间】:2011-01-01 15:01:40
【问题描述】:

我有以下查看代码:

def activate( request = '', actkey = "" ):
    message = ""
    if len( actkey ) != 40:
        message += str( len(actkey))
        if request.method == 'POST':
            form = ActivateForm( request.POST )
            if form.is_valid():
                actkey = request.POST['actkey']
                activate( '', actkey )
        else:
            form = ActivateForm()
    else:
        profile = userprofile.objects.get( actkey = actkey )
        user = User.objects.get( id = profile.user_id )
        user.is_active = True
        user.save()
        profile.actkey = ""
        profile.save()
        message += "Uw account is succesvol geactiveerd."
        return render_to_response( 'profile/register.html', { 'message' : message } )
    return render_to_response( 'profile/register.html', { 'message' : message, 'form' : form } )

它的作用很简单,当通过 URL 给出激活密钥时,它会转到: 个人资料 = 用户个人资料....等 但是当它没有给出它时,它会加载 django 表单,以便用户可以输入它的激活码(到目前为止一切正常) 但是当用户发布他的激活密钥时,它会出现在if len( actkey ) != 40: 这不应该发生,因为激活密钥是 40 ......但是因为它再次显示表单,但也激活了用户,所以我得到了不需要的行为......

我该如何解决这个问题?

感谢您的帮助

【问题讨论】:

    标签: django forms views


    【解决方案1】:

    解决此问题的最佳方法是使用重定向到上一页:

    return redirect(request.META['HTTP_REFERER'])
    

    【讨论】:

      【解决方案2】:

      这两者都不是我想要的,但我是这样解决的:

      def activate( request = '', actkey = "" ):
      message = ""
      if len( actkey ) != 40:
          if request.method == 'POST':
              form = ActivateForm( request.POST )
              if form.is_valid():
                  actkey = request.POST['actkey']
      
                  profile = userprofile.objects.get( actkey = actkey )
                  user = User.objects.get( id = profile.user_id )
                  user.is_active = True
                  user.save()
                  profile.actkey = ""
                  profile.save()
                  message += "Uw account is succesvol geactiveerd."
                  return render_to_response( 'profile/register.html', { 'message' : message } )
          else:
              form = ActivateForm()
      else:
          profile = userprofile.objects.get( actkey = actkey )
          user = User.objects.get( id = profile.user_id )
          user.is_active = True
          user.save()
          profile.actkey = ""
          profile.save()
          message += "Uw account is succesvol geactiveerd."
          return render_to_response( 'profile/register.html', { 'message' : message } )
      return render_to_response( 'profile/register.html', { 'message' : message, 'form' : form } )
      

      感谢您的回复:)

      【讨论】:

        【解决方案3】:

        您应该在成功提交表单后重定向

         if request.method == 'POST':
           form = ActivateForm( request.POST )
           if form.is_valid():
             actkey = form.cleaned_data['actkey']#access cleaned_data instead of raw post
             activate( '', actkey )
             return HttpResponseRedirect('/')
        

        【讨论】:

          【解决方案4】:

          我可能误解了你的意图。 但我认为当表格有效时,您应该执行以下操作:

          if form.is_valid():
              actkey = request.POST['actkey']
              activate( '', actkey )
              return render_to_response( 'profile/register.html', { 'message' : message } )
          

          即。激活用户后省略表单对象。

          【讨论】:

          猜你喜欢
          • 2016-10-26
          • 2014-03-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-06-20
          相关资源
          最近更新 更多