مقدمه

در این درس، ما یک سیستم کامل برای مدیریت حساب‌های کاربری به اپلیکیشن خود اضافه می‌کنیم. Django بسیاری از قابلیت‌های مورد نیاز برای احراز هویت (authentication) و مدیریت مجوزها (authorization) را به صورت آماده فراهم می‌کند. ما از این قابلیت‌ها برای ایجاد صفحات ورود (login)، خروج (logout) و ثبت‌نام (registration) استفاده خواهیم کرد.

ایجاد اپلیکیشن users

برای سازماندهی بهتر، ما تمام منطق مربوط به کاربران را در یک اپلیکیشن جداگانه به نام users قرار می‌دهیم.

(ll_env) $ python manage.py startapp users
                    

سپس، این اپلیکیشن جدید را به لیست INSTALLED_APPS در فایل settings.py پروژه اصلی اضافه می‌کنیم.

Copy Icon learning_log/settings.py
INSTALLED_APPS = [
    # ... other apps
    'learning_logs',
    'users',
]

ساخت صفحات ورود و خروج

برای ساخت صفحات ورود و خروج، کافی است تمپلیت‌های مورد نیاز را ایجاد کنیم. Django به طور پیش‌فرض به دنبال تمپلیت‌هایی با نام registration/login.html و registration/logged_out.html می‌گردد. ما فقط کافی است این فایل‌ها را در مسیر users/templates/registration/ بسازیم و آن‌ها را مطابق نیاز خود ویرایش کنیم.

۱. تعریف URLها

ابتدا، الگوهای URL برای اپلیکیشن users را تعریف می‌کنیم. Django ویوهای پیش‌فرضی برای ورود و خروج فراهم می‌کند که ما می‌توانیم مستقیماً از آنها استفاده کنیم. یک فایل جدید به نام users/urls.py بسازید.

Copy Icon users/urls.py
"""Defines URL patterns for users"""
from django.urls import path, include

app_name = 'users'
urlpatterns = [
    # Include default auth urls.
    path('', include('django.contrib.auth.urls')),
]

django.contrib.auth.urls شامل الگوهای URL پیش‌فرض برای ورود (/login/) و خروج (/logout/) است. سپس، این فایل urls را به فایل urls.py اصلی پروژه متصل می‌کنیم.

۲. ساخت تمپلیت ورود

ویوی پیش‌فرض ورود Django به دنبال یک تمپلیت در مسیر registration/login.html می‌گردد. ما این تمپلیت را ایجاد می‌کنیم.

Copy Icon users/templates/registration/login.html
{% extends "learning_logs/base.html" %}

{% block content %}
  {% if form.errors %}
    <p>Your username and password didn't match. Please try again.</p>
  {% endif %}

  <form method="post" action="{% url 'users:login' %}">
    {% csrf_token %}
    {{ form.as_p }}
    <button name="submit">Log in</button>
    <input type="hidden" name="next" value="{% url 'learning_logs:index' %}" />
  </form>
{% endblock content %}

این تمپلیت یک فرم ورود استاندارد را نمایش می‌دهد. Django به صورت خودکار یک فرم لاگین را به این تمپلیت پاس می‌دهد.

صفحه ثبت‌نام

برای صفحه ثبت‌نام، باید یک ویو، URL و تمپلیت سفارشی بسازیم.

Copy Icon users/views.py
from django.contrib.auth.forms import UserCreationForm
from django.contrib.auth import login

def register(request):
    """Register a new user."""
    if request.method != 'POST':
        form = UserCreationForm()
    else:
        form = UserCreationForm(data=request.POST)
        if form.is_valid():
            new_user = form.save()
            # Log the user in and then redirect to home page.
            login(request, new_user)
            return redirect('learning_logs:index')
    
    context = {'form': form}
    return render(request, 'registration/register.html', context)

این ویو از فرم داخلی Django به نام UserCreationForm برای مدیریت ثبت‌نام استفاده می‌کند. پس از ثبت‌نام موفق، کاربر به صورت خودکار لاگین شده و به صفحه اصلی هدایت می‌شود.

در این درس، ما با استفاده از سیستم احراز هویت داخلی Django، یک فرآیند کامل برای ورود، خروج و ثبت‌نام کاربران را پیاده‌سازی کردیم. این یک گام بزرگ در تبدیل وبلاگ ما به یک اپلیکیشن چندکاربره است. در درس بعدی، به سراغ «امکان مالکیت داده توسط کاربر» خواهیم رفت و موضوعات و یادداشت‌ها را به کاربرانی که آنها را ایجاد کرده‌اند، متصل خواهیم کرد.