Django

⌘K
  1. Home
  2. Django
  3. Django তে কিভাবে কাজ করতে...
  4. User Model লগইন রেজিস্ট্রেশন (default )

User Model লগইন রেজিস্ট্রেশন (default )

Initial Setup

একটি প্রজেক্ট বানাই এবং ডেটাবেজ মাইগ্রেশন করি

python manage.py migrate

সুপার ইউজার না থাকলে বানাই

python manage.py createsuperuser

Django রেজিস্ট্রেশন সিস্টেম

Django ডিফল্ট ভাবে আমাদের জন্য রেজিস্ট্রেশন বাদে লগইন ও পাসওয়ার্ড রিসেটের জন্য route ও ভিউ এবং ডিফল্ট টেম্পলেট বানিয়ে রেখেছে আমরা টেম্পলেট গুলো কপি করে registration নামক ফোল্ডারে রেখে অথবা দিতে পারি টেমপ্লেটের লোকেশন কোথায়।

আমরা একটি কাজ করতে পারি সেটা হলো একটি app বানিয়ে সেটার মধ্যে কাজ করতে পারি তাহলে পরবর্তী তে যেকোনো প্রজেক্ট এ এই app টি ব্যবহার করে কাজ সারতে পারবো।

python manage.py startapp accounts

এপ্লিকেশন টি রেজিস্টার করি settings.py

INSTALLED_APPS = [
    'accounts',
]

এপ্লিকেশন টির মধ্যে urls.py নামে একটি ফাইল তৈরী করি। এবং নিচের কোড লিখি

auth যা Django আমাদের জন্য বানিয়ে রেখেছে তা urls.py তে যুক্ত করি।

from django.urls import path,include 

urlpatterns = [
    path('', include('django.contrib.auth.urls')),

]

আপনি চাইলে এরকম করে দিতে পারেন

from django.contrib.auth import views as auth_views

urlpatterns = [
    # ... your other URL patterns ...
    path('login/', auth_views.LoginView.as_view(template_name='login.html'), name='login'),
    path('logout/', auth_views.LogoutView.as_view(), name='logout'),
    path('password_change/', auth_views.PasswordChangeView.as_view(template_name='password_change.html'), name='password_change'),
    path('password_change/done/', auth_views.PasswordChangeDoneView.as_view(template_name='password_change_done.html'), name='password_change_done'),
    path('password_reset/', auth_views.PasswordResetView.as_view(template_name='password_reset.html'), name='password_reset'),
    path('password_reset/done/', auth_views.PasswordResetDoneView.as_view(template_name='password_reset_done.html'), name='password_reset_done'),
    path('password_reset/<uidb64>/<token>/', auth_views.PasswordResetConfirmView.as_view(template_name='password_reset_confirm.html'), name='password_reset_confirm'),
    path('password_reset/complete/', auth_views.PasswordResetCompleteView.as_view(template_name='password_reset_complete.html'), name='password_reset_complete'),
]

এবার প্রজেক্ট urls.py এর সাথে যুক্ত করি

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

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

সার্ভার রান করি

python manage.py runserver

http://127.0.0.1:8000/accounts/ ব্রাউজার দিয়ে দেখলে দেখবো অনেক গুলো ভিউ দেখাচ্ছে

আমরা যদি এখন কোনো ইউআরএল এ ঢুকার চেষ্টা করি তাহলে TemplateDoesNotExist at /accounts/login/
এরকম এরর শো করবে

Django ডিফল্ট ভাবে রেজিস্ট্রেশন করার জন্য আমাদের কোন ভিউ দেয়না এজন্য প্রথমে আমাদের রেজিস্ট্রেশন এর সিস্টেম বানাতে হবে

এর পরে আমরা পরের কাজ গুলো করতে পারবো কারণ রেজিস্টার করা ছাড়া কিভাবে বাকি লগইন রিসেট পাসওয়ার্ড এর কাজ করবো।

আমরা টেম্পলেট গুলো আমাদের templates ফোল্ডারে রাখবো আমাদের নিচের টেম্পলেট গুলো বানাতে হবে।

  • login.html
  • password_change.html
  • password_change_done.html
  • password_reset.html
  • password_reset_done.html
  • password_reset_confirm.html
  • password_reset_complete.html

কারণ রেজিস্টার করা ছাড়া কিভাবে বাকি লগইন রিসেট পাসওয়ার্ড এর কাজ করবো।

login-registration with User Name

আমরা যদি ডিফল্ট রেজিস্ট্রেশন সিস্টেম ব্যবহার করতে চাই তাহলে আমাদের নিচের মতো করতে হবে

forms.py নামে ফাইল বানাই

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

class SignupForm(UserCreationForm):
    class Meta:
        model = User 
        fields = ['username', 'password1', 'password2']

class LoginForm(forms.Form):
    username = forms.CharField()
    password = forms.CharField(widget=forms.PasswordInput)

views.py

from django.shortcuts import render, redirect
from django.contrib.auth import authenticate, login, logout 
from .forms import UserCreationForm, LoginForm


# Create your views here.
# Home page
def index(request):
    return render(request, 'registration/index.html')

# signup page
def user_signup(request):
    if request.method == 'POST':
        form = UserCreationForm(request.POST)
        if form.is_valid():
            form.save()
            return redirect('login')
    else:
        form = UserCreationForm()
    return render(request, 'registration/signup.html', {'form': form})

# login page
def user_login(request):
    if request.method == 'POST':
        form = LoginForm(request.POST)
        if form.is_valid():
            username = form.cleaned_data['username']
            password = form.cleaned_data['password']
            user = authenticate(request, username=username, password=password)
            if user:
                login(request, user)    
                return redirect('home')
    else:
        form = LoginForm()
    return render(request, 'registration/login.html', {'form': form})

# logout page
def user_logout(request):
    logout(request)
    return redirect('login')

registration/signup.html

<h1>Signup</h1>
<form method="POST">
    {% csrf_token %}
    {{ form.as_p }}
    <button type="submit">Signup</button>
    <a href="{% url 'login' %}">Already have account?</a>
</form>

registration/login.html

<h1>Login</h1>
<form method="POST">
    {% csrf_token %}
    {{ form.as_p }}
    <button type="submit">Login</button>
    <a href="{% url 'signup' %}">Dont have Account Create</a>
</form>

index.html

{% if request.user.is_authenticated %}
  <p>{{ request.user.username }}</p>
  <a href="{% url 'logout' %}">Logout</a>
{% else %}
  <a href="{% url 'login' %}">Login</a>
  <a href="{% url 'signup' %}">Signup</a>
{% endif %}

<h1>Welcome!</h1>

urls.py

from django.urls import path
from . import views

urlpatterns = [
    path('', views.index, name='home'),
    path('login/', views.user_login, name='login'),
    path('signup/', views.user_signup, name='signup'),
    path('logout/', views.user_logout, name='logout'),
]

Home Page

Login Page

Signup Page

base template

এপ্লিকেশন ফোল্ডারের টেম্পলেট ফোল্ডারে registration/base.html নামে ফাইল বানাই। আসলে এই ফাইলটি বার বার লগইন ও রেজিস্ট্রেশন পেজ এ ব্যবহারের জন্য বানাচ্ছি

templates/registration/base.html


{% load static %}
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title> Authentication </title>
    <!-- Font Icon -->
    <link rel="stylesheet" href="{% static 'fonts/material-icon/css/material-design-iconic-font.min.css' %}">
    <link rel="stylesheet" href="{% static 'css/style.css' %}">


</head>
<body>
    <div class="main">
        {% block content %}

        {% endblock %}

    </div>
   


</body>
</html>

নিচের ফাইলটি ডাউনলোড করে এপ্লিকেশন ফোল্ডারের টেম্পলেট ফোল্ডারে পেস্ট করো

static file link

প্রজেক্ট এর স্ট্যাটিক ফাইল সেটাপ করি

# settings.py
import os
STATICFILES_DIRS = [
    os.path.join(BASE_DIR, 'static'),
]
STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles')  # Define your STATIC_ROOT

Register with User Name

আমরা home নামে একটি ভিউ বানাই যাতে রেজিস্ট্রেশন এর পর রিডাইরেক্ট করতে পারি। আমরা চাইলে লগইন পেজে রিডাইরেক্ট করতে পারি কিন্তু আমি এখানে চাচ্ছি রেজিস্ট্রেশন করলে লগইন হয়ে যাবে অটো এরপর হোম পেজ এ যাবে।

from django.http import HttpResponse
def home(request):
    return HttpResponse("home")

models.py

# models.py
from django.contrib.auth.models import AbstractUser
from django.db import models

class CustomUser(AbstractUser):
    email = models.EmailField(unique=True)

    # Add any additional fields or methods as needed

settings.py

AUTH_USER_MODEL = 'accounts.CustomUser'

forms.py

# forms.py
from django import forms
from django.contrib.auth.forms import UserCreationForm
from .models import CustomUser

class CustomUserCreationForm(UserCreationForm):
    class Meta:
        model = CustomUser
        fields = ['username','email', 'password1', 'password2']
        

views.py

# myapp/views.py
from django.shortcuts import render, redirect
from django.contrib.auth.forms import UserCreationForm
from django.contrib.auth import login
from .forms import CustomUserCreationForm



def register(request):
    if request.method == 'POST':
        form = CustomUserCreationForm(request.POST)
        if form.is_valid():
            user = form.save()
            login(request, user)
            return redirect('home')  # Replace 'home' with your desired URL after registration
    else:
        form = CustomUserCreationForm()
    return render(request, 'registration/register.html', {'form': form})

urls.py

from django.urls import path,include 
from . import views
urlpatterns = [
    path('', include('django.contrib.auth.urls')),
    path("home",views.home,name="home"),
    path('register',views.register,name="register"),

]

registration/register.html

এই কোডটি সাধারণ কোড আমি এর পরে বুটস্ট্র্যাপ ডিজাইনের একটি কোড ব্যবহার করবো বুঝার জন্য এটা ব্যবহার করছি

{% extends "registration/base.html" %}
{% block content  %}
    <h1>Register</h1>
    <form action="" method="post">
        {% csrf_token %}
        {% for field in form %}
            {% if field.errors %}
                <p>{{ field.errors }}</p>
            {% endif %}
            <label for="{{ field.name }}">{{ field.label }}</label>
            {{ field }}
            <br/>
        {% endfor %}
        <input type="submit" value="Register">
    </form>
    {% endblock  %}

বুটস্ট্র্যাপ ডিজাইনের কোড



{% extends "registration/base.html" %}
{% load static %}
{% block content %}
    <section class="signup">
        <div class="container">
            <div class="signup-content">
                <div class="signup-form">
                    <h2 class="form-title">Register</h2>
                    <form method="post" action="{% url 'register' %}" class="register-form" id="register-form" novalidate>
                        {% csrf_token %}
                        {{ form.non_field_errors }}

                        <div class="form-group">
                            <label for="{{ form.username.id_for_label }}">
                                <i class="zmdi zmdi-account material-icons-name"></i>
                            </label>
                            {{ form.username }}
                            <div class="invalid-feedback">
                                {{ form.username.errors }}
                            </div>
                        </div>


                        <div class="form-group">
                            <label for="{{ form.email.id_for_label }}">
                                <i class="zmdi zmdi-email material-icons-name"></i> 
                            </label>
                            {{ form.email }}
                            <div class="invalid-feedback">
                                {{ form.email.errors }}
                            </div>
                        </div>



                        <div class="form-group">
                            <label for="{{ form.password1.id_for_label }}">
                                <i class="zmdi zmdi-lock"></i>
                            </label>
                            {{ form.password1 }}
                            <div class="invalid-feedback">
                                {{ form.password1.errors }}
                            </div>
                        </div>

                        <div class="form-group">
                            <label for="{{ form.password2.id_for_label }}">
                                <i class="zmdi zmdi-lock-outline"></i>
                            </label>
                            {{ form.password2 }}
                            <div class="invalid-feedback">
                                {{ form.password2.errors }}
                            </div>
                        </div>

                        <!-- <div class="form-group">
                            <input type="checkbox" name="agree-term" id="agree-term" class="agree-term" />
                            <label for="agree-term" class="label-agree-term">
                                <span><span></span></span>I agree all statements in  
                                <a href="#" class="term-service">Terms of service</a>
                            </label>
                        </div> -->

                        <div class="form-group form-button">
                            <input type="submit" name="signup" id="signup" class="form-submit" value="Register"/>
                        </div>
                    </form>
                </div>
                <div class="signup-image">
                    <!-- You can customize this image or remove it -->
                    <figure><img src="{% static 'images/signup-image.jpg' %}" alt="signup image"></figure>
                    <a href="{% url 'login' %}" class="signup-image-link">I am already a member</a>
                </div>
            </div>
        </div>
    </section>
{% endblock %}

Login

এপ্লিকেশন এর টেম্প্লেটস এর registration ফোল্ডারে লগইন টেম্পলেট তৈরী করি

যেহেতু আমরা টিউটোরিয়ালের শুরুতে Django ডিফল্ট auth ভিউ ব্যবহার করেছি তাই শুধু টেম্পলেট বানালেই হবে।

registration/login.html



{% extends 'registration/base.html' %}
{% load static %}
{% block content %}
    <section class="sign-in">
        <div class="container">
            <div class="signin-content">
                <div class="signin-image">
                    <figure><img src="{% static 'images/signin-image.jpg' %}" alt="signin image"></figure>
                    <a href="{% url 'register' %}" class="signup-image-link">Create an account</a>
                </div>
                <div class="signin-form">
                    <h2 class="form-title">Log in</h2>
                    <form method="post" class="register-form" id="login-form">
                        {% csrf_token %}
                        <div class="form-group">
                            <label for="your_name"><i class="zmdi zmdi-account material-icons-name"></i></label>
                            <input type="text" name="username" id="your_name" placeholder="Your Name" required />
                        </div>
                        <div class="form-group">
                            <label for="your_pass"><i class="zmdi zmdi-lock"></i></label>
                            <input type="password" name="password" id="your_pass" placeholder="Password" required />
                        </div>
                        <div class="form-group">
                            <input type="checkbox" name="remember-me" id="remember-me" class="agree-term" />
                            <label for="remember-me" class="label-agree-term"><span><span></span></span>Remember me</label>
                        </div>
                        <div class="form-group form-button">
                            <input type="submit" name="signin" id="signin" class="form-submit" value="Log in" />
                        </div>
                    </form>
                    <div class="social-login">
                        <span class="social-label">Or login with</span>
                        <ul class="socials">
                            <li><a href="#"><i class="display-flex-center zmdi zmdi-facebook"></i></a></li>
                            <li><a href="#"><i class="display-flex-center zmdi zmdi-twitter"></i></a></li>
                            <li><a href="#"><i class="display-flex-center zmdi zmdi-google"></i></a></li>
                        </ul>
                    </div>
                </div>
            </div>
        </div>
    </section>
{% endblock %}

লগইন করলে Django ডিফল্ট ভাবে প্রোফাইল পেজ এ নিয়ে যাই আমরা ঐটা পরিবর্তন করে home এ পাঠিয়ে দেব এজন্য setings.py তে নিচের কোড অ্যাড করি।

LOGIN_REDIRECT_URL = 'home'  

লগইন পেজটি নিচের মতো এখানে social লগইন আইকন আছে ঐগুলো আমরা পরে করবো

Password Reset View

settings.py

#gmail_send/settings.py
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
EMAIL_HOST = 'smtp.gmail.com'
EMAIL_HOST_USER = 'olee.techs@gmail.com'
EMAIL_HOST_PASSWORD = 'jzsbfkxvmxiabwow' #past the key or password app here
EMAIL_PORT = 587
EMAIL_USE_TLS = True
DEFAULT_FROM_EMAIL = 'from oleetech'

আমাদের ৪টি ভিউ লাগবে পাসওয়ার্ড রিসেট এর কাজ করতে

  1. password_reset: Form where the user submit the email address
  2. password_reset_done: Page displayed to the user after submitting the email form. Usually with instructions to open the email account, look in the spam folder etc. And asking for the user to click on the link he will receive.
  3. password_reset_confirm: The link that was emailed to the user. This view will validate the token and display a password form if the token is valid or an error message if the token is invalid (e.g. was already used or expired).
  4. password_reset_complete: Page displayed to the user after the password was successfully changed.

List of required templates:

  • registration/password_reset_form.html
  • registration/password_reset_subject.txt
  • registration/password_reset_email.html
  • registration/password_reset_done.html
  • registration/password_reset_confirm.html
  • registration/password_reset_complete.html

password_reset

registration/password_reset_form.html

রেজিস্ট্রেশন শেষে ডিফল্টভাবে নতুন ব্যবহারকারীর is_active স্ট্যাটাসটি False

1. Django সিগন্যাল তৈরি করুন

প্রথমে একটি সিগন্যাল তৈরি করুন যা নতুন ব্যবহারকারী তৈরি হলে তার is_active ফিল্ডটি False করে দেবে।

accounts/signals.py

from django.db.models.signals import post_save
from django.dispatch import receiver
from django.contrib.auth.models import User

@receiver(post_save, sender=User)
def deactivate_new_user(sender, instance, created, **kwargs):
    # যদি নতুন ইউজার তৈরি হয়, তাহলে `is_active` ফিল্ডটি False সেট করুন
    if created and instance.is_active:  # Check if user is created and active by default
        instance.is_active = False
        instance.save()

2. সিগন্যাল রেজিস্টার করুন

আপনার অ্যাপের apps.py ফাইলে এই সিগন্যালটি রেজিস্টার করুন, যাতে Django অ্যাপ্লিকেশন শুরু হলে সিগন্যালটি লোড হয়।

accounts/apps.py

from django.apps import AppConfig

class AccountsConfig(AppConfig):
    name = 'accounts'

    def ready(self):
        import accounts.signals  # Signals রেজিস্টার করুন

3. settings.py-এ অ্যাপ্লিকেশন কনফিগার করুন

আপনার অ্যাপটি INSTALLED_APPS-এ যোগ করুন এবং ডিফল্টভাবে accounts অ্যাপের কনফিগারেশন ব্যবহার করুন।

# settings.py
INSTALLED_APPS = [
    # অন্যান্য অ্যাপগুলো
    'accounts.apps.AccountsConfig',  # Signals সহ Accounts অ্যাপটি ব্যবহার করুন
]

এখন, যখনই নতুন ব্যবহারকারী রেজিস্ট্রেশন করবে, তাদের is_active স্ট্যাটাস False সেট হয়ে যাবে এবং অ্যাকাউন্টটি নিষ্ক্রিয় থাকবে। আপনি চাইলে Django অ্যাডমিন প্যানেল থেকে এই স্ট্যাটাস ম্যানুয়ালি সক্রিয় করতে পারবেন অথবা ইমেল ভেরিফিকেশন যুক্ত করতে পারেন যাতে ব্যবহারকারী নিজের ইমেল নিশ্চিত করার পর অ্যাকাউন্টটি সক্রিয় হয়।

How can we help?