Как я могу отправить сообщение из представления в другое представление при использовании реверса в Django
У меня есть 2 представления для вставки номера телефона, а другое представление используется для проверки OTP кода, теперь я хочу отправить сообщение из представления проверки в предыдущее представление, которое показывает, что код проверки не действителен или время истекло.
этот вид просто проверяет номер телефона, который регистрируется или нет
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, })
этот вид для проверки OTP кода, если он не действителен или время истекло, он возвращается к виду manage_accout, которому я хочу отправить сообщение тоже.
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'))
Как я могу это сделать?
Вы захотите добавить сообщение прямо перед вашим перенаправлением в представлении проверки, например, так:
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'))
Затем вам нужно добавить HTML для отображения сообщения либо на следующей странице, либо (лучше) в базовый шаблон, используемый каждой страницей на вашем сайте. Что-то вроде:
{% if messages %}
<ul class="messages">
{% for message in messages %}
<li{% if message.tags %} class="{{ message.tags }}"{% endif %}>{{ message }}</li>
{% endfor %}
</ul>
{% endif %}
Вы можете прочитать больше о django messages framework здесь в docs.
Если вы используете Bootstrap и хотите интегрировать фреймворк сообщений с классами сообщений Bootstrap, есть прекрасный пример того, как это сделать здесь.