'how can I send a message from a view to another view when use reverse in Django
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?
Solution 1:[1]
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.
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source |
|---|---|
| Solution 1 | Milo Persic |
