0

I have 2 views for inserting phone number and another view is used to verify OTP code, now I want to send a message from verify view to the previous view that shows verify code is not valid or the time has expired.

this view just check phone number that registar or not

def manage_account(request,):



form = RegisterForm(request.POST)

if request.method == 'POST':
    # if user is exist just login else make user
    try:
        if 'phone_number' in request.POST:
            phone_number = request.POST.get('phone_number')
            user = UserPhone.objects.get(phone_number=phone_number)
            # send OTP
            otp = helper.get_random_otp()
            # helper.send_otp(phone_number, otp)
            # save otp
            user.otp = otp
            print('OTP:', otp)
            user.save()
            request.session['user_phone'] = user.phone_number
            # redirect to verify page
            return HttpResponseRedirect(reverse('verify'))
    except UserPhone.DoesNotExist:
        form = RegisterForm(request.POST)
        if form.is_valid():
            user = form.save(commit=False)
            # send otp
            otp = helper.get_random_otp()
            # helper.send_otp(phone_number, otp)
            # save otp
            user.is_active = False
            user.otp = otp
            print('OTP:', otp)
            user.save()
            # for send a value to other pages
            request.session['user_phone'] = user.phone_number
            # redirect to verify page
            return HttpResponseRedirect(reverse('verify'))

return render(request, 'registration/login.html', {'form': form, })

this view for verify OTP Code if is not valid or time has expired it reverse to manage_accout view that I want to send a message too.

def verify(request):
# for get value from other pages
request.session['verification'] = True
verification = 0
try:
    phone_number = request.session.get('user_phone')
    user = UserPhone.objects.get(phone_number=phone_number)
    if request.method == 'POST':
        #chek otp exprition
        if not helper.check_otp_expiration(user.phone_number):
            # show message in manage_account, that expire time

            return HttpResponseRedirect(reverse('manage_account',))


        if user.otp != int(request.POST.get('otp')):
            # show message in manage_account, that OTP code is not valid

            return HttpResponseRedirect(reverse('manage_account',))
        else:
            user.is_active =True
            user.save()
            login(request, user)
            return HttpResponseRedirect(reverse('myaccount'))

    return render(request, 'registration/verify.html', {'phone_number': phone_number})

except UserPhone.DoesNotExist:
    return HttpResponseRedirect(reverse('manage_account'))

how can I Do this?

1 Answers1

0

You will want to add the message right before your redirect in the verify view, like so:

def verify(request):
# for get value from other pages
request.session['verification'] = True
verification = 0
try:
    phone_number = request.session.get('user_phone')
    user = UserPhone.objects.get(phone_number=phone_number)
    if request.method == 'POST':
        #chek otp exprition
        if not helper.check_otp_expiration(user.phone_number):
            messages.info(request, f'Your message here')
            return HttpResponseRedirect(reverse('manage_account',))


        if user.otp != int(request.POST.get('otp')):
            messages.info(request, f'Your message here')
            return HttpResponseRedirect(reverse('manage_account',))
        else:
            user.is_active =True
            user.save()
            login(request, user)
            return HttpResponseRedirect(reverse('myaccount'))

    return render(request, 'registration/verify.html', {'phone_number': phone_number})

except UserPhone.DoesNotExist:
    return HttpResponseRedirect(reverse('manage_account'))

Then you'll need to add some HTML to display the message, either on the page that follows or (better) in the base template used by every page on your site. Something like:

{% if messages %}
<ul class="messages">
    {% for message in messages %}
    <li{% if message.tags %} class="{{ message.tags }}"{% endif %}>{{ message }}</li>
    {% endfor %}
</ul>
{% endif %}

You can read up more on the django messages framework here in the docs.

If you're using Bootstrap and want to integrate the messages framework with Bootstrap message classes, there is an excellent example of how to do so here.

Milo Persic
  • 985
  • 1
  • 7
  • 17