0

i have three form in same page with Django. If i submit register form or pay form my page always submit login form. I have one model form and two standart forms in form.py Where is my mistake?

if request.method == 'POST':
    login_form = LoginForm(data=request.POST)
    register_form = RegisterForm(data=request.POST)
    pay_form = CardForm(data=request.POST)
    if login_form.is_valid():
        username = request.POST['username']
        password = request.POST['password']
        user=authenticate(username=username,password=password)
        if user:
            if user.is_active:
                login(request,user)
                return HttpResponseRedirect('/')
            else:
                return HttpResponse("Your account is disabled")
        else:
            return HttpResponse("Yanlış Kullanici adi ya da şifre")
    else:
        return HttpResponse("Login Form is not valid")
    if register_form.is_valid():
        register_form.save()
    else:
        return HttpResponse("Register Form is not valid")
    if pay_form.is_valid():
        holder_name = request.POST['holder_name']
        card_number = request.POST['card_number']
        exp_year = request.POST['exp_year']
        exp_month = request.POST['exp_month']
        cvv = request.POST['cvv']
        satinAl(request,event_id,card_number,holder_name,exp_month,exp_year,cvv)
    else:
        return HttpResponse("Pay Form is not valid")
else:
    login_form = LoginForm()
    pay_form=CardForm()
    register_form = RegisterForm()
    return render_to_response('index.html', locals(),context_instance=RequestContext(request))
Mert Saygı
  • 139
  • 3
  • 13
  • 1
    When a POST is received, `login_form.is_valid` method gets called first, and that is validated, which will return false if it is not filled. The rest of the logic has no chance of being evaluated. See this answer for clues to solve your problem: http://stackoverflow.com/questions/1395807/proper-way-to-handle-multiple-forms-on-one-page-in-django – mrkre Sep 10 '14 at 03:40

1 Answers1

0

You have to create 3 form tags in html (template) like this:

<html >
<body>
<form acrtion="." method="POST">
{{login_form}}
<input type="submit" name="loginform" value="loginform">
</form>

<form acrtion="." method="POST">
{{pay_form}}
<input type="submit" name="pay_form" value="pay_form">
</form>

<form acrtion="." method="POST">
{{register_form}}
<input type="submit" name="register_form" value="register_form">
</form>

</body>
</html>

Then In controller :

login_form = LoginForm()
pay_form=CardForm()
register_form = RegisterForm()
if request.method == 'POST':
    login_form = LoginForm(data=request.POST)
    register_form = RegisterForm(data=request.POST)
    pay_form = CardForm(data=request.POST)

    if 'loginform' in  request.POST:
      if login_form.is_valid():
        username = request.POST['username']
        password = request.POST['password']
        user=authenticate(username=username,password=password)
        if user:
            if user.is_active:
                login(request,user)
                return HttpResponseRedirect('/')
            else:
                return HttpResponse("Your account is disabled")
        else:
            return HttpResponse("Yanlış Kullanici adi ya da şifre")
      else:
        return HttpResponse("Login Form is not valid")
    if 'register_form' in request.POST:
      if register_form.is_valid():
        register_form.save()
      else:
        return HttpResponse("Register Form is not valid")
    if 'pay_form' in request.POST:
      if pay_form.is_valid():
        holder_name = request.POST['holder_name']
        card_number = request.POST['card_number']
        exp_year = request.POST['exp_year']
        exp_month = request.POST['exp_month']
        cvv = request.POST['cvv']
        satinAl(request,event_id,card_number,holder_name,exp_month,exp_year,cvv)
      else:
        return HttpResponse("Pay Form is not valid")

return render_to_response('index.html', locals(),context_instance=RequestContext(request))
Yogesh dwivedi Geitpl
  • 3,592
  • 1
  • 17
  • 33