Django.urls.exceptions.NoReverseMatch: Обратное соответствие для 'login_otp' не найдено. 'login_otp' не является действительной функцией представления или именем шаблона
Я создал Django приложение, в котором я создал пользовательскую модель пользователя и использую вход через otp. Я хочу отправить otp по электронной почте. Я получаю ошибку -
"django.urls.exceptions.NoReverseMatch: Reverse for 'login_otp' not найден. 'login_otp' не является допустимой функцией представления или именем шаблона."
.
Не могу решить эту задачу.
Следующая модель:
User = get_user_model()
class S_Society_Association_Master(AbstractBaseUser):
member_id = models.CharField(verbose_name = "Member_ID", primary_key=True, max_length=100, unique=True)
member_name = models.CharField(verbose_name = "Member Name", max_length=100)
password = models.CharField(verbose_name = "Password", default=NULL, max_length = 100, null=True, blank=True)
member_contact_number = models.CharField(verbose_name="Phone Number", max_length=15)
otp = models.CharField(max_length=6, blank=False, default=0) # For HOTP Verification
member_role = models.CharField(verbose_name="Member's Role", max_length=100,
choices=[("P", "President"), ("T", "Treasurer"), ("S", "Secretary"),
("EC", "EC members"), ("O", "Other members")])
member_email_id = models.EmailField(verbose_name = "Member's Email", max_length=100)
member_from_date = models.DateField(verbose_name = "Member From", auto_now_add=True)
member_to_date = models.DateField(verbose_name="Member To")
created_date = models.DateField(verbose_name = "Created Date", auto_now_add = True, blank=True, null=True)
created_by = models.ForeignKey(User, to_field='id', related_name = "assoc_created_by", on_delete = models.SET_NULL, verbose_name="Created By", max_length=100, blank=True, null=True)
last_updated_date = models.DateField(verbose_name = "Updated Date", auto_now = True, blank=True, null=True)
last_updated_by = models.ForeignKey(User, to_field='id', related_name = "assoc_updated_by", on_delete = models.SET_NULL, verbose_name="Last Updated By", max_length=100, blank=True, null=True)
USERNAME_FIELD = 'member_email_id'
Далее следует мой views.py-:
def login_attempt(request):
if request.method == 'POST':
email = request.POST.get('email')
member = S_Society_Association_Master.objects.filter(member_email_id = email).first()
if member is None:
context = {'message' : 'User not found' , 'class' : 'danger' }
return render(request, 'societyadmin/sa_login.html', context)
otp = str(random.randint(1000, 9999))
member.otp = otp
member.save()
MessageHandler(email, member.otp).send_otp_on_email()
request.session['email'] = email
return redirect('login_otp')
return render(request, 'societyadmin/sa_login.html')
def login_otp(request):
email = request.session['email']
context = {'email':email}
if request.method == 'POST':
otp = request.POST.get('otp')
member = S_Society_Association_Master.objects.filter(member_contact_number=mobile).first()
if otp == member.otp:
member_row = S_Society_Association_Master.objects.get(member_id = member.member_id)
login(request , member_row)
context = {'message' : 'Welcome', 'member_id': member_row.member_id, 'email':email }
return render(request,'societyadmin/home.html' , context)
else:
context = {'message' : 'Wrong OTP' , 'class' : 'danger','email':email }
return render(request,'societyadmin/sa_login_otp.html' , context)
return render(request,'societyadmin/sa_login_otp.html' , context)
def society_admin_home(request):
member_id=request.POST.get['member_id']
return render(request, 'societyadmin/home.html')
helpers.py. Здесь представлены функции для отправки сообщения на мобильный телефон и электронную почту.
from django.conf import settings
from twilio.rest import Client #I am using Twilio to send messages on phone.
from django.core.mail import send_mail
import random
class MessageHandler:
phone_number = None
otp = None
def __init__(self, phone_number, otp) -> None:
self.phone_number = phone_number
self.otp = otp
def send_otp_on_email(self):
member_name = self.member_name
member_email = self.member_email_id
subject = 'Login OTP'
message = f'Hi {member_name}, Your otp to login is {self.otp}'
email_from = settings.EMAIL_HOST_USER
recipients = [member_email, ]
send_mail(subject, message, email_from, recipients)
return None
urls.py в директории проекта
from django.contrib import admin
from django.contrib.auth import views as auth_views
from django.urls import path, include
app_name = 'societyadmin'
urlpatterns = [
path('admin/', admin.site.urls),
path('societyadmin/', include(('societyadmin.urls', 'societyadmin'), namespace='societyadmin')),
]
urls.py в каталоге app
from .views import *
app_name = 'societyadmin'
urlpatterns = [
path('', login_attempt, name = "login"),
path('home', society_admin_home , name="society_admin_home"),
path('login_otp', login_otp , name="login_otp")
]
home.html
<p>Society Admin</p>
<p>"Welcome{{request.user.member_name}}</h1>
sa_login.html
{% extends "./../base.html" %}
{% block content %}
Вход
{% csrf_token %}
-->
<p>Don't have account? Write to support team.</p>
<button class="btn btn-primary">Submit</button>
</form>
</div>
</div>
{% endblock %}
sa_login_otp.html
{% extends "./../base.html" %}
{% block content %}
<div class="container mt-5 pt-4">
<div class="col-6 mx-auto">
<h3 class="text-center">Enter OTP sent to your number {{mobile}}</h3>
{% if message %}
<div class="alert alert-{{class}}">
{{message}}
</div>
{% endif %}
<form action = "{% url 'societyadmin:login_otp' %}" class="mt-2" method="post">
{% csrf_token %}
<div class="row">
<div class="form-group col-12 mt-3">
<input type="text" placeholder="Enter otp" class="form-control" name="otp" id="">
</div>
</div>
<p>Don't have account? Contact support to register</p>
<button class="btn btn-primary">Submit</button>
</form>
</div>
</div>
{% endblock %}