Django表单:提交后重新加载视图

3

I have the following view code:

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给出激活密钥时,它所做的事情很简单,转到: profile = userprofile....等等。 但是当没有给出密钥时,它会加载django表单,以便用户可以输入其激活代码(到目前为止都正常工作), 但是当用户发布其激活密钥时,它就会进入if len( actkey ) != 40: 这不应该发生,因为激活密钥是40位的... 但由于它再次显示表单,同时也激活了用户,我得到了不想要的行为...
如何解决这个问题?
谢谢帮助。
4个回答

5

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

 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('/')

3
最好的解决方法是使用重定向到前一个页面:
return redirect(request.META['HTTP_REFERER'])

0

虽然不完全是我想要的,但我用这种方式修复了它:

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 } )

感谢回复 :)


-1

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

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

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


这个函数在render()引入之前就存在了,工作方式类似,但不会将请求放在响应中。不建议使用,并且可能在未来被弃用。请查看文档:https://docs.djangoproject.com/en/1.11/topics/http/shortcuts/ - Raphael Amponsah

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接