يحتوي جانغو على بعض الأدوات المدمجة لإعداد قدرة المستخدمين على تسجيل الدخول و الخروج من تطبيق الويب. و في هذا الدرس سنرى كيفية إعداد هذه الخاصية.
أولاً، سنقوم بإعداد أنماط URL والمسارات التي نحتاجها، ثم سنقوم بإعداد دوال العرض المطلوبة.
في دوال العرض، سنستفيد من فئتين رائعتين يقدمهما جانغو. و هما فئات UserCreationForm
و AuthenticationForm
. توفر هاتان الفئتان طريقة لدعم إعدادات التسجيل وتسجيل الدخول بالكامل للنماذج للتعامل مع هذه المهام، مع تضمين التحقق من الصحة مباشرةً. فلنبدأ.
تطبيق الحسابات
سنبدأ بإنشاء تطبيق جديد تحت إسم accounts للاحتفاظ بالملفات التي سنحتاجها لوظائف تسجيل الدخول وتسجيل الخروج.

سجل التطبيق مع جانغو
في أي وقت تريد استخدام تطبيق جديد داخل مشروع Django، ستحتاج إلى تسجيله في ملف settings.py. في مايلي نرى تطبيقين مخصصين في مشروع Django، أحدهما للمشاركات والآخر للحسابات.
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'posts',
'accounts'
إضافة ملف urls.py
لا يقوم الأمر startapp
تلقائيًا بإنشاء ملف urls.py
داخل مجلد التطبيق الجديد (و لا أعلم لماذا لا يقوم جانغو بذلك). لذلك سنحتاج إلى إنشاء ملف urls.py
داخل تطبيق accounts
.

مساحة الاسم وأنماط URL
نحتاج إلى طريقة لعرض نموذج لمستخدم التطبيق لإتاحة فرصة التسجيل. لاحظ أيضًا أننا نمنح هذا التطبيق مساحة اسم accounts
، و عند استخدام المسارات المُسمّاة، لن يتم الخلط بين Django إذا كانت هناك مسارات بنفس الاسم في تطبيقات مختلفة. يمكنه استخدام مساحة الاسم لتحديد أي منها.
#accounts/urls.py
from django.urls import path
from . import views
app_name = 'accounts'
urlpatterns = [
path('signup/', views.signup_view, name='signup')
يحدد الكود أعلاه نمطًا بحيث إذا قام المستخدم بزيارة /signup
داخل مساحة الاسم /accounts
، فسيتم تشغيل دالة Signup_view()
. سنرى ما تفعله هذه الدالة بعد قليل.
تضمين عناوين URL
لقد رأينا هذا النمط عدة مرات حتى الآن في سياق دروس Django التعليمية، وهذا يتضمن أنماط URL من أحد التطبيقات، في ملف urls.py
الأساسي لمشروع Django.
يضمن الكود الموالي أنه في أي وقت يقوم فيه المستخدم بزيارة http://example.com/accounts، فإنه سيستفيد بعد ذلك من أنماط عناوين URL المحددة في accounts/urls.py (الموضحة أعلاه مباشرة).
from django.contrib import admin
from django.urls import path, include
from . import views
urlpatterns = [
path('', views.home),
path('admin/', admin.site.urls),
path('accounts/', include('accounts.urls')),
]
إنشاء دوال العرض
يمكننا الآن تعريف بعض دوال العرض للتعامل مع طلبات Http. أولاً، نعرف دالة Signup_view()
الذي تقبل طلب Http، ثم تعيد عرض لقالب Signup.html
الذي سنقوم بإنشائه بعد قليل.
from django.shortcuts import render
def signup_view(request):
return render(request, 'accounts/signup.html')
في Pycharm يمكننا اختيار إضافة دليل جديد وتوفير مسار templates/accounts
مما يمنحنا مساحة اسم لطيفة لقوالبنا في accounts/templates/accounts
.

ثم في دليلنا الجديد، نضيف قالب Signup.html
.

سنقوم أيضًا بإنشاء مجلد layout للاحتفاظ بقالب base.html
الذي يمكننا التوسع منه.

بعد ذلك و داخل مجلد layout نقوم بإنشاؤ ملف base.html.

و سيحتوي ملف base.html على الكود التالي :
<!doctype html>
<html lang="ar">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
{% load static %}
<link rel="stylesheet" href="{% static "posts/css/bootstrap.min.css" %}">
<title>Django blog</title>
</head>
<body class="container mt-5">
{% block content %}
{% endblock content %}
</body>
</html>
يمتد قالب Signup.html بعد ذلك من خلال ملف base.html، وفي الوقت الحالي نضيف فقط علامة h1
بسيطة لإعلامنا بأن هذه هي صفحة الاشتراك.
{% extends "./layout/base.html" %}
{% load static %}
{% block content %}
<h1>Signup</h1>
{% endblock content %}
كانت هذه بعض الخطوات التي يجب اتخاذها، ولكن الآن يجب أن يكون لدينا سيناريو عملي عند زيارة http://localhost:8000/accounts/signup/.

نموذج إنشاء مستخدم
تعدفئة UserCreationForm()
أحد القطع السحرية. و هي ما يعرف ب Model Form.
ما يجعلها رائعة للغاية هو أنها تقوم بعدد كبير من الخطوات لك دفعة واحدة، بما في ذلك إنشاء كود Html للنموذج ليتم عرضه في القالب.
تحتوي على ثلاثة حقول: اسم المستخدم (من نموذج المستخدم)، كلمة المرور 1، وكلمة المرور 2. تتحقق من تطابق كلمة المرور 1 وكلمة المرور 2، وتتحقق من صحة كلمة المرور باستخدام validate_password ()
، وتعين كلمة مرور المستخدم باستخدام set_password ()
.
لاستخدام هذا النموذج، نقوم أولاً باستيراده في أعلى الملف.
في السطر 7، يتم إنشاء مثيل جديد لهذا النموذج باستخدام form = UserCreationForm()
. في السطر 8 و من خلال دالة render()
، يمكننا تمرير هذا النموذج إلى القالب باستخدام القاموس كمعلمة ثالثة.
from django.shortcuts import render
from django.contrib.auth.forms import UserCreationForm
# Create your views here.
def signup_view(request):
form = UserCreationForm()
return render(request, 'accounts/signup.html', {'form': form})
أما في ملف Signup.html نقوم بكتابة الكود التالي :
{% extends "./layout/base.html" %}
{% load static %}
{% block content %}
<h1>Signup</h1>
<form action="/accounts/signup/" method="post">
{{ form }}
</form>
{% endblock content %}
و إذا قمنا بزيارة http://localhost:8000/accounts/signup/ فإننا نرى الآن نموذج تسجيل المستخدم الرائع، وكان ذلك بأقل جهد.

إضافة زر الإرسال
الشيء الوحيد الذي لم يتم تضمينه في إنشاء النموذج هو زر الإرسال. يمكننا إضافته يدويًا كما نرى في الكود التالي:
{% extends "./layout/base.html" %}
{% load static %}
{% block content %}
<h1>Signup</h1>
<form action="/accounts/signup/" method="post">
{{ form }}
<input type="submit" value="Signup">
</form>
{% endblock content %}
الآن أصبح لدينا النموذج كاملا، مع زر إرسال جاهز.

حفظ المستخدمين
الآن سنقوم بربط دالة Signup_view()
بحيث تكتشف عملية إرسال النموذج، وتتخذ الإجراء المناسب بناءً على ما إذا كان طلب POST أو طلب GET.
في الكود الموالي إذا تم اكتشاف طلب POST، فإننا نأخذ محتويات form
ونخزنه في متغير form
هذا باستخدام form = UserCreationForm(request.POST)
. و للتحقق من صحة النموذج، كل ما عليك فعله هو استخدام form.is_valid()
.
إذا سار كل شيء على مايرام يمكنك حفظ المستخدم باستخدام form.save()
، ثم إعادة التوجيه إلى قائمة المنشورات باستخدام return redirect('posts:list')
.
أما يخصوص الشرط else
فإنه يتعامل مع طلب GET، ويقوم ببساطة بإنشاء نموذج فارغ وإرساله إلى قالب التسجيل.
from django.shortcuts import render, redirect
from django.contrib.auth.forms import UserCreationForm
# Create your views here.
def signup_view(request):
if request.method == 'POST':
form = UserCreationForm(request.POST)
if form.is_valid():
form.save()
return redirect('posts:list')
else:
form = UserCreationForm()
return render(request, 'accounts/signup.html', {'form': form})
رمز CSRF
قبل أن نحاول إرسال هذا النموذج، نحتاج إلى التأكد من تضمين رمز csrf للتحقق من صحته.
يضمن رمز csrf
أن الطلب الذي يتم إرساله إلى تطبيق جانغو صالح وآمن. لإضافة رمز csrf
إلى نموذج Django، استخدم علامات القالب مثل {% csrf_token %}
.
{% extends "./layout/base.html" %}
{% load static %}
{% block content %}
<h1>Signup</h1>
<form action="/accounts/signup/" method="post">
{% csrf_token %}
{{ form }}
<input type="submit" value="Signup">
</form>
{% endblock content %}
أولاً، سنحاول تسجيل مستخدم جديد، و يمكننا استخدام كلمة مرور غير مناسبة.

يعمل UserCreationForm
بشكل مثالي. فهو يتعامل مع التحقق من الصحة تلقائيًا ويقدم نصائح حول كيفية حل المشكلة.

بعد حفظ المستخدم الجديد في قاعدة البيانات. يمكننا التحقق من ذلك من خلال زيارة صفحة المدير وإلقاء نظرة على ذلك.

عرض نموذج المصادقة
ختى الأن يقوم النموذج بإنشاء مستخدم جديد في التطبيق ولكن لا يمكن للمستخدمين تسجيل الدخول.
و هنا بأتي دور جانغو مع مميزاته المدمجة لتسهيل الأمور. جيث يوفر لنا فئة AuthenticationForm()
. و هي المسؤولة عن تسجيل الدخول و الخروج من التطبيق.
و لإستعمال هذه الميزة نحتاج إلى مسار جديد وو دالة عرض وقالب لعرض نموذج تسجيل الدخول.
يقوم الكود الموالي بإعداد مسار تسجيل الدخول، و دالة login_view()
، و هو ما يسمى تسجيل الدخول.
#accounts/urls.py
from django.urls import path
from . import views
app_name = 'accounts'
urlpatterns = [
path('signup/', views.signup_view, name='signup'),
path('login/', views.login_view, name='login')
]
أما الكود الموالي يوضح كيف يمكننا استخدام AuthenticationForm
في دالة login_view()
.
#accounts/views.py
from django.shortcuts import render, redirect
from django.contrib.auth.forms import UserCreationForm, AuthenticationForm
# Create your views here.
def signup_view(request):
if request.method == 'POST':
form = UserCreationForm(request.POST)
if form.is_valid():
form.save()
return redirect('posts:list')
else:
form = UserCreationForm()
return render(request, 'accounts/signup.html', {'form': form})
def login_view(request):
if request.method == 'POST':
form = AuthenticationForm(data=request.POST)
if form.is_valid():
return redirect('posts:list')
else:
form = AuthenticationForm()
return render(request, 'accounts/login.html', {'form': form})
وأخيرًا، نحتاج إلى قالب login.html لعرض نموذج تسجيل الدخول للمستخدم.
يتم عرض النموذج في القالب بطريقة مشابهة لما كنا نستخدمه UserCreationForm
. حيث يتم تعيين إجراء النموذج باستخدام علامات القالب و دالة URL
إلى مسار مسمى. كما نقوم أيضًا بتضمين رمز csrf
تمامًا كما كان من قبل.
accounts/templates/accounts/login.html
{% extends "./layout/base.html" %}
{% load static %}
{% block content %}
<h1>Log In</h1>
<form action="{% url 'accounts:login' %}" method="post">
{% csrf_token %}
{{ form }}
<input type="submit" value="Log In">
</form>
{% endblock content %}
الآن يمكننا اختبار ذلك. و إذا لم نستخدم بيانات الاعتماد الصحيحة، فإن النموذج يعمل بشكل مثالي ويخبرنا بذلك.

أما في حالة تقديم بيانات الاعتماد الصحيحة، يعيد النموذج توجيهنا كما نريد.
و كما رأينا يوفر Django نظام مصادقة قويًا لتطبيقات الويب. فهو يغطي جميع حالات الاستخدام الأكثر شيوعًا لنظام المصادقة ويستفيد من بعض الفئات الرائعة حقًا مثل UserCreationForm وAuthenticationForm.
اكتشاف المزيد من بايثون العربي
اشترك للحصول على أحدث التدوينات المرسلة إلى بريدك الإلكتروني.