Pff ... قواعد البيانات مرة أخرى؟
هناك ثلاث علاقات رئيسية في قاعدة البيانات العلائقية:
- علاقة رأس برأس
- علاقة رأس بأطراف.
- علاقة كثير بأطراف.
في هذه المقالة ، سنتعامل مع أول هذه العلاقة ، علاقة رأس برأس.
عادةً ما يكون لدى Django بالفعل نموذج مستخدم يأتي مع الإطار. يأتي مع الحقول والأساليب والسمات الخاصة به ، إلخ. عيب نموذج المستخدم هذا هو أنه لا يسمح لك بإضافة حقول مخصصة بصرف النظر عن الإعدادات الافتراضية المتوفرة بالفعل في Django. قد تكون هذه مشكلة خطيرة حيث قد يحتاج المطور إلى تكوين ملف تعريف مستخدم / عميل بالكامل من مجموعة من المستخدمين المصادق عليهم. على سبيل المثال ، قد يحتاج موقع المدونة إلى ملف تعريف المؤلف ، والذي قد يتضمن صورة المستخدم وعنوان الاتصال والهواية والمكانة ، إلخ. ونموذج المستخدم الذي يأتي مع Django لا يسمح بذلك.
لحل هذه المشكلة ، يقوم المطورون بإنشاء نموذج ملف تعريف مخصص وتوصيله بنموذج المستخدم الافتراضي في Django باستخدام علاقة رأس برأس. يحدث أن يتم ضمان اتصال المستخدم بملف تعريف واحد والعكس صحيح. بالإضافة إلى ذلك ، يسمح هذا الميكانيكي بتحكم أفضل في تخصيص نموذج ملف التعريف.
الآن سأوضح لك كيف يمكنك القيام بذلك في Django.
1. استخدم نموذج مستخدم Django الافتراضي
في التطبيق الذي تريد إنشاء ملف تعريف فيه ، قم بإنشاء ملف Forms.py جديد . في Forms.py ، قم باستيراد الوحدات النمطية التالية:
from django.contrib.auth.forms import UserCreationForm
from django.contrib.auth.models import User
أنشئ فصلًا لترث منه
UserCreationForm. داخل هذه الفئة ، قم بإنشاء فئة تعريفية أخرى تحتوي على متغيرين: modelو fields. modelسيحتفظ المتغير بنموذج المستخدم الخاص بك ، وسيحتوي المتغير على fieldsحقول النموذج التي سيتم إنشاؤها.
class createUserForm(UserCreationForm):
class meta:
model = User
fields = ['username', 'password1', 'password2']
سيقوم الرمز أعلاه بإنشاء نموذج يحتوي على حقول لاسم المستخدم وكلمة المرور وتأكيد كلمة المرور.
2. قم بإنشاء نموذج ملف تعريف المستخدم المخصص.
في ملف Models.py الخاص بك ، قم باستيراد نموذج المستخدم الافتراضي.
from django.contrib.auth.models import User
بعد ذلك ، تحتاج إلى إنشاء نموذج ملف التعريف الخاص بك ، وكذلك إنشاء حقل مستخدم بعلاقة رأس برأس مع نموذج المستخدم الافتراضي في Django.
class Profile(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE, null=True,)
name = models.CharField(max_length=200, null=True)
email = models.CharField(max_length=200, null=True)
address = models.CharField(max_length=200, null=True)
def __str__(self):
return self.name
3. قم بإنشاء شكل لنموذج ملف التعريف الخاص بك.
افتح ملف form.py واستورد نموذج ملفك الشخصي من Models.py ، وأضف أيضًا بعض الواردات الأخرى التي ستكون مفيدة عند إنشاء نموذج ملف التعريف الخاص بك.
from django import forms
from django.utils.translation import ugettext_lazy as _
from .models import Profile
ثم قم بإنشاء فصل ترث منه
forms.ModelForm. في هذه الفئة ، قم بإنشاء فئة تعريفية أخرى تحتوي على متغيرين: modelو fields. modelيحتوي المتغير على نموذج ملف fieldsالتعريف وحقول النموذج التي سيتم إنشاؤها.
class profileForm(forms.ModelForm):
class Meta:
model = Profile
fields = ['name', 'email', 'address']
#The labels attribute is optional. It is used to define the labels of the form fields created
labels = {
"name": _("Name "),
"email": _("Email Address"),
"address": _("Street Address"),
}
الآن وقد أصبحت النماذج جاهزة ، سنقوم بتعريف منطق views.py قبل عرضها على القوالب الخاصة بنا.
4. أضف المنطق إلى views.py .
للعمل مع النماذج التي تم إنشاؤها في Forms.py ، تحتاج إلى استيرادها إلى ملف view.py الخاص بنا ، وإضافة بعض الوحدات النمطية التي ستكون مفيدة لإنشاء منطق.
from django.shortcuts import render, redirect
from django.contrib.auth import authenticate, login,
from django.contrib import messages
from .models import Profile
from .forms import createUserForm, profileForm
لنقم الآن بإنشاء صفحة تسجيل. دعنا فقط نسميها RegisterPage . لنقم بإنشاء قاموس سياق فارغ وإرجاع العرض.
def registerPage(request):
context = {}
return render(request, 'app_name/register.html', context)
لنقم بتعيين القيم من النموذج إلى المتغيرات عن طريق استدعاء طريقة POST. ثم سنمرر المتغيرات إلى قاموس السياق.
def registerPage(request):
if request.method == 'POST':
form = createUserForm(request.POST)
profile_form = profileForm(request.POST)
context = {'form': form, 'profile_form': profile_form}
return render(request, 'app_name/register.html', context)
ثم سنقوم بالتحقق من كلا النموذجين وحفظهما بعد ذلك.
def registerPage(request):
if request.method == 'POST':
form = createUserForm(request.POST)
profile_form = profileForm(request.POST)
if form.is_valid() and profile_form.is_valid():
user = form.save()
#we don't save the profile_form here because we have to first get the value of profile_form, assign the user to the OneToOneField created in models before we now save the profile_form.
profile = profile_form.save(commit=False)
profile.user = user
profile.save()
context = {'form': form, 'profile_form': profile_form}
return render(request, 'app_name/register.html', context)
إذا تم التحقق من صحة قيم النموذج وحفظها ، فسنعرض رسالة نجاح ونعيد توجيه المستخدم إلى صفحة تسجيل الدخول.
def registerPage(request):
if request.method == 'POST':
form = createUserForm(request.POST)
profile_form = profileForm(request.POST)
if form.is_valid() and profile_form.is_valid():
user = form.save()
#we don't save the profile_form here because we have to first get the value of profile_form, assign the user to the OneToOneField created in models before we now save the profile_form.
profile = profile_form.save(commit=False)
profile.user = user
profile.save()
messages.success(request, 'Your account has been successfully created')
return redirect('login')
context = {'form': form, 'profile_form': profile_form}
return render(request, 'app_name/register.html', context)
5. عرض القالب
في الملف ، قم
register.htmlبإنشاء علامة نموذج باستخدام طريقة POST actionوقيمة سلسلة فارغة. في علامة النموذج csrf_token، سنضع في تنسيق قالب django ، ثم سنعرض النماذج ديناميكيًا (نماذج المستخدم والملف الشخصي). أيضًا ، دعونا لا ننسى زر الإرسال.
<form method="POST" action="">
{% csrf_token %}
<h3>Register Profile</h3>
<div class="form-field">
{{profile_form.name.label_tag}}
{{profile_form.name}}
</div>
<div class="form-field">
{{form.username.errors}}
{{form.username.label_tag}}
{{form.username}}
</div>
<div class="form-field">
{{profile_form.email.label_tag}}
{{profile_form.email}}
</div>
<div class="form-field">
{{profile_form.address.label_tag}}
{{profile_form.address}}
</div>
<div class="form-field">
{{form.password1.errors}}
{{form.password1.label_tag}}
{{form.password1}}
</div>
<div class="form-field">
{{form.password2.errors}}
{{form.password2.label_tag}}
{{form.password2}}
</div>
<hr>
<input id="form-button" class="btn btn-success btn-block" type="submit" value="Create Profile">
<br>
{{form.non_field_errors}}
<p>Already have an account? <a href="{% url 'login' %}">Login</a></p>
</form>
نظرًا لأنه بعد ملء النموذج والتحقق من صحته وحفظه ، يتم إعادة توجيهنا إلى صفحة تسجيل الدخول ، سيتم عرض رسالة حول نجاح العملية على صفحة تسجيل الدخول في الجزء السفلي مباشرة قبل النقش "ليس لديك حساب؟ تسجيل " .
<form method="POST" action="">
...
<hr>
<input id="form-button" class="btn btn-success btn-block" type="submit" value="Login">
{% for message in messages %}
<p>{{message}}</p>
{% endfor %}
<p>Don't have an account? <a href="{% url 'store:register' %}">Register</a></p>
</form>
هذه هي الطريقة التي يمكنك من خلالها إنشاء نموذج ملف تعريف لموقعك ، مرتبطًا بنموذج المستخدم الخاص بك في علاقة واحد لواحد.