django sign up
First, create a Django app if you haven't already:
django-admin startproject myproject
Then, create an app within your project:
cd myproject
python manage.py startapp myapp
In your app's models.py, define a custom user model by subclassing AbstractBaseUser
and PermissionsMixin
from django.contrib.auth.models
. Include necessary fields:
from django.contrib.auth.models import AbstractBaseUser, BaseUserManager, PermissionsMixin
from django.db import models
class CustomUserManager(BaseUserManager):
def create_user(self, email, password=None, extra_fields):
if not email:
raise ValueError('The Email field must be set')
email = self.normalize_email(email)
user = self.model(email=email, extra_fields)
user.set_password(password)
user.save(using=self._db)
return user
def create_superuser(self, email, password=None, extra_fields):
extra_fields.setdefault('is_staff', True)
extra_fields.setdefault('is_superuser', True)
if extra_fields.get('is_staff') is not True:
raise ValueError('Superuser must have is_staff=True.')
if extra_fields.get('is_superuser') is not True:
raise ValueError('Superuser must have is_superuser=True.')
return self.create_user(email, password, extra_fields)
class CustomUser(AbstractBaseUser, PermissionsMixin):
email = models.EmailField(unique=True)
is_active = models.BooleanField(default=True)
is_staff = models.BooleanField(default=False)
date_joined = models.DateTimeField(auto_now_add=True)
USERNAME_FIELD = 'email'
REQUIRED_FIELDS = []
objects = CustomUserManager()
def __str__(self):
return self.email
Then, update your settings.py
to use the custom user model:
# settings.py
AUTH_USER_MODEL = 'myapp.CustomUser'
Now, perform the migration to create necessary tables in the database:
python manage.py makemigrations
python manage.py migrate
Finally, to create a sign-up view, use Django's built-in CreateView
:
# views.py
from django.urls import reverse_lazy
from django.views.generic.edit import CreateView
from .forms import CustomUserCreationForm
class SignUpView(CreateView):
form_class = CustomUserCreationForm
success_url = reverse_lazy('login')
template_name = 'signup.html'
Create a form in forms.py:
# forms.py
from django import forms
from .models import CustomUser
class CustomUserCreationForm(forms.ModelForm):
password = forms.CharField(label='Password', widget=forms.PasswordInput)
class Meta:
model = CustomUser
fields = ('email',)
def save(self, commit=True):
user = super().save(commit=False)
user.set_password(self.cleaned_data['password'])
if commit:
user.save()
return user
Then, create a signup.html template to render the sign-up form:
<!-- signup.html -->
<form method="post">
{% csrf_token %}
{{ form.as_p }}
<button type="submit">Sign Up</button>
</form>
Set up the URL pattern to map to the SignUpView:
# urls.py
from django.urls import path
from .views import SignUpView
urlpatterns = [
path('signup/', SignUpView.as_view(), name='signup'),
# ... other URLs
]
Ensure your template structure is properly set up and the necessary paths are linked to your views.