Login + Register with Extra Info (Profile)

 


authdemo/

├── authdemo/           ← Project folder

│   └── urls.py

├── users/              ← Custom user app

│   ├── views.py

│   ├── forms.py

│   ├── urls.py

│   └── templates/

│       └── users/

│           ├── login.html

│           └── home.html

└── manage.py

Step 1: Project Setup


django-admin startproject authdemo
cd authdemo
python manage.py startapp users


✅ Step 2: Add App to settings.py

# authdemo/settings.py INSTALLED_APPS = [ ..., 'users', 'django.contrib.auth', 'django.contrib.sessions', ]


✅ Step 3: Create Profile Model


# users/models.py

from django.db import models
from django.contrib.auth.models import User

class Profile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    phone = models.CharField(max_length=15)
    address = models.TextField()
    dob = models.DateField(null=True, blank=True)
    gender = models.CharField(max_length=10, choices=[('male','Male'),('female','Female')])

    def __str__(self):
        return self.user.username




✅ Step 4: Make Migrations

python manage.py makemigrations python manage.py migrate


✅ Step 5: Create Register Form


from django import forms
from django.contrib.auth.models import User

class CustomRegisterForm(forms.ModelForm):
    password = forms.CharField(widget=forms.PasswordInput)
    confirm_password = forms.CharField(widget=forms.PasswordInput)

    # Extra fields
    phone = forms.CharField()
    address = forms.CharField(widget=forms.Textarea)
    dob = forms.DateField(widget=forms.DateInput(attrs={'type': 'date'}))
    gender = forms.ChoiceField(choices=[('male','Male'), ('female','Female')])

    class Meta:
        model = User
        fields = ['username', 'email', 'password']

    def clean(self):
        cleaned_data = super().clean()
        p1 = cleaned_data.get('password')
        p2 = cleaned_data.get('confirm_password')
        if p1 and p2 and p1 != p2:
            raise forms.ValidationError("Passwords do not match")




✅ Step 6: Create Views


# users/views.py

from django.shortcuts import render, redirect
from django.contrib.auth import authenticate, login, logout
from .forms import CustomRegisterForm
from .models import Profile

def register_view(request):
    if request.method == 'POST':
        form = CustomRegisterForm(request.POST)
        if form.is_valid():
            user = form.save(commit=False)
            user.set_password(form.cleaned_data['password'])
            user.save()

            Profile.objects.create(
                user=user,
                phone=form.cleaned_data['phone'],
                address=form.cleaned_data['address'],
                dob=form.cleaned_data['dob'],
                gender=form.cleaned_data['gender']
            )

            return redirect('login_view')
    else:
        form = CustomRegisterForm()
    return render(request, 'register.html', {'form': form})

def login_view(request):
    error = None
    if request.method == 'POST':
        username = request.POST.get('username')
        password = request.POST.get('password')
        user = authenticate(username=username, password=password)
        if user:
            login(request, user)
            return redirect('home')
        else:
            error = 'Invalid credentials'
    return render(request, 'login.html', {'error': error})

def logout_view(request):
    logout(request)
    return redirect('login_view')

from django.contrib.auth.decorators import login_required

@login_required
def home_view(request):
    return render(request, 'home.html')



✅ Step 7: Add Templates

📄 register.html


<h2>Register</h2>
<form method="post">
    {% csrf_token %}
    {{ form.as_p }}
    <button type="submit">Register</button>
    <a href="{% url 'login_view' %}">Already have an account? Login</a>
</form>



📄 login.html

<h2>Login</h2>
{% if error %}<p style="color:red">{{ error }}</p>{% endif %}
<form method="post">
    {% csrf_token %}
    Username: <input type="text" name="username"><br><br>
    Password: <input type="password" name="password"><br><br>
    <button type="submit">Login</button>
     <a href="{% url 'register_view' %}">Don't have an account? Register</a>
</form>


📄 home.html

<h2>Welcome {{ request.user.username }}</h2> <a href="{% url 'logout_view' %}">Logout</a>




✅ Step 8: Setup URLs

🔹 users/urls.py



from django.urls import path
from . import views

urlpatterns = [
    path('register/', views.register_view, name='register_view'),
    path('login/', views.login_view, name='login_view'),
    path('logout/', views.logout_view, name='logout_view'),
    path('', views.home_view, name='home'),
]




🔹 authdemo/urls.py


from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', include('users.urls')),
]





✅ Step 9: Create Superuser (Optional)

python manage.py createsuperuser


✅ Step 10: Run the Server

python manage.py runserver




✅ Result: 📝 /register/ → Registration form with extra fields 🔐 /login/ → Login form 🏠 / → Home page (login required) 🚪 /logout/ → Logout

Comments

Popular posts from this blog

Mastering Django: Project and App Folder Structure

Mastering Django Template Language (DTL): A Step-by-Step Guide

How to Add Templates in Django: Step-by-Step Guide