Reputation: 357
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 } )
What it does is simple, when the activation key is given through the URL, it goes to:
profile = userprofile.... etc.
But when it's not given it loads the django form so the user can type it's activation code (all works well so far)
But when the user posts his activation key it comes in the if len( actkey ) != 40:
That shouldn't happen because the activation key is 40... But since it shows the form again, but activates the user as well i get unwanted behavior...
How can i fix this?
Thanks for the help
Upvotes: 4
Views: 28050
Reputation: 110
The best way to solve this problem is using a redirect to the previous page:
return redirect(request.META['HTTP_REFERER'])
Upvotes: 4
Reputation: 357
It's both not quite what i was looking for, but i fixed it this way:
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 } )
Thanks for the replies :)
Upvotes: 0
Reputation: 6318
You should redirect after a successful form submission
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('/')
Upvotes: 6
Reputation: 33225
I may misunderstand your intension. But I think when the form is valid you should do something like:
if form.is_valid():
actkey = request.POST['actkey']
activate( '', actkey )
return render_to_response( 'profile/register.html', { 'message' : message } )
ie. omit the form object after you activate the user.
Upvotes: -1