views:

219

answers:

3

Hi all,

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

A: 

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.

Satoru.Logic
A: 

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

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

Bloeper