0
votes

Please help. The signup page keeps showing this field is required error. I'm a beginner. thankyouu

models.py

from django.db import models

from django.contrib.auth.models import AbstractBaseUser, BaseUserManager

class UserManager(BaseUserManager):

def create_user(self, email, username, full_name, password=None):
    if not email:
        raise ValueError("Users must have an email adress")
    if not username:
        raise ValueError("Users must have a username")
    if not password:
        raise ValueError("Users must have a password")
    if not full_name:
        raise ValueError("Users must have a name")
    user = self.model(
        email=self.normalize_email(email), # return lowercase
        username=username,
        full_name=full_name,
    )
    user.set_password(password) # users set password and change password
    user.full_name = full_name
    user.save(using=self._db)# using the default database in settings.py
    return user

def create_superuser(self, email, username, full_name, password=None):
    user = self.create_user(
        email=self.normalize_email(email),  # return lowercase
        username=username,
        full_name=full_name,
        password=password,
    )
    user.is_admin = True
    user.is_staff = True
    user.is_superuser = True
    user.save(using=self._db)  # using the default database in settings.py
    return user

class Account(AbstractBaseUser):

email               = models.EmailField(
    verbose_name="email",
    max_length=60,
    unique=True,
)
username            = models.CharField(max_length=30, unique=True)
full_name           = models.CharField(max_length=30, blank=True, null=True)
date_joined         = models.DateTimeField(verbose_name='date joined', auto_now_add=True)
last_login          = models.DateTimeField(verbose_name='last login', auto_now=True)
is_admin            = models.BooleanField(default=False)
is_active           = models.BooleanField(default=True)
is_staff            = models.BooleanField(default=False)
is_superuser        = models.BooleanField(default=False)
profile_image       = models.ImageField(max_length=255, null=True, blank=True, default=default_profile)
hide_email          = models.BooleanField(default=True)

USERNAME_FIELD = "email"
REQUIRED_FIELDS = ["username", "full_name"]

objects = UserManager()   # tie account to my custom user manager

def __str__(self):
    return self.username

# "Does the user have a specific permission?"
def has_perm(self, perm, obj=None):
    return True

# "Does the user have permissions to view the app `app_label`?"
def has_module_perms(self, app_label):
    return True

views.py

from django.shortcuts import render, redirect

from django.contrib.auth import login, logout, authenticate

from account.forms import RegistrationForm, AccountAuthenticationForm

def register_view(request):

user = request.user
if user.is_authenticated:
    return redirect('home')
if request.method == 'POST':
    form = RegistrationForm(request.POST)
    if form.is_valid():
        form.save()
        email = form.cleaned_data.get('email').lower()
        raw_password = form.cleaned_data.get('password1')
        user = authenticate(email=email, password=raw_password)
        login(request, user)
        return redirect('home')
else:
    form = RegistrationForm()
return render(request, 'account/register.html', {'registration_form': form})

def login_view(request):

context = {}

user = request.user
if user.is_authenticated:
    return redirect("home")

if request.POST:
    form = AccountAuthenticationForm(request.POST)
    if form.is_valid():
        email = request.POST.get('email')
        password = request.POST.get('password')
        user = authenticate(request, email=email, password=password)
        if user is not None:
            login(request, user)
            return redirect("home")
else:
    form = AccountAuthenticationForm()
    context['login_form'] = form
return render(request, "account/login.html", context)

def logout_view(request): logout(request) return redirect("home")

forms.py

from django import forms

from django.contrib.auth import get_user_model

from .models import Account

from django.contrib.auth import authenticate

User = get_user_model()

class RegistrationForm(forms.ModelForm):

full_name   = forms.CharField()
email       = forms.EmailField(max_length=60, help_text='Required. Add a valid email address.')
password1   = forms.CharField(widget=forms.PasswordInput)
password2   = forms.CharField(widget=forms.PasswordInput, label='Confirm password')


class Meta:
    model = Account
    fields = (
        'email',
        'username',
        'full_name',
        'password1',
        'password2',
    )

def save(self, commit=True):
    user = super(RegistrationForm, self).save(commit=False)
    user.email = self.cleaned_data.get('email')
    user.username = self.cleaned_data.get('username')
    user.full_name = self.cleaned_data.get('full_name')
    if commit:
        user.save()
    return user

def clean_email(self):
    email = self.cleaned_data.get('email')
    qs = User.objects.filter(email=email)
    if qs.exists():
        raise forms.ValidationError(f"Email {email} is already taken")
    return email

def clean_username(self):
    username = self.cleaned_data.get('username')
    qs = User.objects.filter(username=username)
    if qs.exists():
        raise forms.ValidationError(f"Username {username} is already taken")
    return username

def clean(self):
    data = self.cleaned_data
    password1 = self.cleaned_data.get('password1')
    password2 = self.cleaned_data.get('password2')
    if password2 != password1:
        raise forms.ValidationError("Passwords must match")
    return data

class AccountAuthenticationForm(forms.ModelForm):

password = forms.CharField(label='Password', widget=forms.PasswordInput)

class Meta:
    model = Account
    fields = ('email', 'password')

def clean(self):
    if self.is_valid():
        email = self.cleaned_data.get('email')
        password = self.cleaned_data.get('password')
    if not authenticate(email=email, password=password):
        raise forms.ValidationError("Incorrect username or password")
2
Can you copy the (whole) exact error you're seeing?Manuel Fedele
@MilesDavis i think the error just shows up in the register.html page saying "This field is required"Angeline Karen

2 Answers

0
votes

The cause of the problem could be due to the username field and email field being used one in place of the other.

An example found in the code mentioned above:

USERNAME_FIELD = "email"
REQUIRED_FIELDS = ["username", "full_name"]

The problem can be resolved by verifying and fixing these errors where the email field is used in place of username field and vice versa.

0
votes

Most likely there is a error in your fields html id and name so the form validation registers it as an empty value