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 %}
Вернуться на верх