when i enter the otp_code that comes from the create_otp_code definition it must show me a success message but it returns the below error
i have highlighted the line of error on views.py
you can find the django codes of the app here in below
view.py
from django.shortcuts import render, redirect
from django.contrib.auth import authenticate, login
from django.contrib.auth.decorators import login_required
from account.forms import CustomUserCreationForm, SignInForm
import random
from django.utils import timezone
from datetime import timedelta
from django.contrib import messages
from .models import *
# Create your views here.
def signup(request):
global form
if request.method == 'POST':
form = CustomUserCreationForm(request.POST)
if form.is_valid():
user = form.save()
login(request, user)
return redirect('success_massage')
else:
form = CustomUserCreationForm()
return render(request, 'account/signup.html', {'form': form})
def signin(request):
if request.method == 'POST':
getting_in = SignInForm(request.POST)
if getting_in.is_valid():
cd = getting_in.cleaned_data
user = authenticate(username=cd['username'], password=cd['password'])
if user is not None:
login(request, user)
return redirect('success_massage')
else:
getting_in = SignInForm()
return render(request, 'account/signin.html', {'form': getting_in})
@login_required
def change_password(request):
if request.method == 'POST':
user = request.user
password = request.POST.get('password')
confirm_password = request.POST.get('confirm_password')
if password == confirm_password:
user.set_password(password)
user.save()
return redirect('success_massage')
return render(request, 'change_password.html', {'form': change_password})
@login_required
def create_otp_code(request):
if request.method == 'POST':
code = random.randint(1000, 9999)
OtpCode.objects.create(user=request.user, code=code)
return redirect('enter_otp_code')
return render(request, 'account/create_otp_code.html')
@login_required
def enter_otp_code(request):
if request.method == 'POST':
code = request.POST.get('otp_code')
otp_object = OtpCode.objects.filter(user=request.user, code=code)
if otp_object:
**if timezone.now() - otp_object.created_at <= timedelta(minutes=5):**
request.user.is_active = True
request.user.save()
otp_object.delete()
return redirect('success_massage')
else:
otp_object.delete()
messages.error(request, 'OTP code expired')
else:
messages.error(request, 'OTP code not found')
return render(request, 'enter_otp_code.html')
urls.py
from django.urls import path
from .views import *
urlpatterns = [
path('signup/', signup, name='signup'),
path('signin/', signin, name='login'),
path('change_password/', change_password, name='change_password'),
path('create_otp_code', create_otp_code),
path('enter_otp_code/', enter_otp_code,name='enter_otp_code'),
]
models.py
from django.db import models
from django.contrib.auth.models import AbstractBaseUser
from .managers import *
from random import randint
# Create your models here.
class User(AbstractBaseUser):
email = models.EmailField(unique=True)
phone_number = models.CharField(max_length=11, unique=True)
joined = models.DateTimeField(auto_now_add=True)
is_staff = models.BooleanField(default=False)
is_active = models.BooleanField(default=False)
objects = UserManager()
USERNAME_FIELD = 'phone_number'
REQUIRED_FIELDS = ['email']
def has_perm(self, perm, obj=None):
return True
def has_module_perms(self, app_lable):
return True
def __str__(self):
return self.phone_number
class OtpCode(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE)
code = models.IntegerField()
created_at = models.DateTimeField(auto_now_add=True)
managers.py
from django.contrib.auth.models import BaseUserManager
class UserManager(BaseUserManager):
def create_user(self, email, phone_number, password=None, ):
if not email:
raise ValueError('Users must have an email address')
if not phone_number:
raise ValueError('Users must have an phone number')
email = self.normalize_email(email)
user = self.model(email=email, phone_number=phone_number, password=password)
user.set_password(password)
user.save(using=self._db)
return user
def create_superuser(self, email, phone_number, password):
if not phone_number:
raise ValueError('Users must have an password')
email = self.normalize_email(email)
user = self.model(email=email, phone_number=phone_number, password=password)
user.is_staff = True
user.is_superuser = True
user.is_active = True
user.set_password(password)
user.save(using=self._db)
return user
app.py
from django.apps import AppConfig
class AccountConfig(AppConfig):
default_auto_field = 'django.db.models.BigAutoField'
name = 'account'
i have re migrate the database…
i used the debug suggestions og pycharm however i have don’t know what to try
New contributor
nima landi is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.