مقدمه
اکنون که صفحه اصلی را ساختهایم، باید ساختار دادههای خود را تعریف کنیم. در Django، دادهها با
«مدلها» (Models) تعریف میشوند. یک مدل، یک کلاس پایتون است که ساختار یک جدول در پایگاهداده را
توصیف میکند. ما دو مدل خواهیم ساخت: Topic برای نگهداری موضوعات وبلاگ، و Entry برای نگهداری
یادداشتهای مربوط به هر موضوع.
learning_logs/models.py
from django.db import models
class Topic(models.Model):
"""A topic the user is learning about."""
text = models.CharField(max_length=200)
date_added = models.DateTimeField(auto_now_add=True)
def __str__(self):
"""Return a string representation of the model."""
return self.text
class Entry(models.Model):
"""Something specific learned about a topic."""
topic = models.ForeignKey(Topic, on_delete=models.CASCADE)
text = models.TextField()
date_added = models.DateTimeField(auto_now_add=True)
class Meta:
verbose_name_plural = 'entries'
def __str__(self):
"""Return a simple string representing the entry."""
return f"{self.text[:50]}..."
در این کد، هر دو کلاس از models.Model ارثبری میکنند. فیلدهای مدل با استفاده از کلاسهای فیلد
Django (مانند CharField و DateTimeField) تعریف میشوند. ForeignKey یک رابطه یک-به-چند
بین Entry و Topic ایجاد میکند. متد __str__() نیز یک نمایش رشتهای خوانا از هر نمونه
را برمیگرداند.
مهاجرت (Migration) و ثبت مدلها
پس از تعریف مدلها، باید به Django بگوییم که چگونه پایگاهداده را برای ذخیره این مدلها تغییر
دهد. این کار با ایجاد و اجرای یک «مهاجرت» (migration) انجام میشود.
(ll_env) $ python manage.py makemigrations learning_logs
(ll_env) $ python manage.py migrate
ثبت مدلها در پنل ادمین
Django یک پنل ادمین قدرتمند برای مدیریت دادهها فراهم میکند. برای اینکه بتوانیم مدلهای خود
را در این پنل مدیریت کنیم، باید آنها را در فایل learning_logs/admin.py ثبت کنیم.
learning_logs/admin.py
from django.contrib import admin
from .models import Topic, Entry
admin.site.register(Topic)
admin.site.register(Entry)
ساخت صفحات جدید
حالا ما دو صفحه جدید میسازیم: یکی برای نمایش لیست تمام موضوعات، و دیگری برای نمایش تمام
یادداشتهای مربوط به یک موضوع خاص.
۱. URLها
ابتدا الگوهای URL جدید را در learning_logs/urls.py اضافه میکنیم.
learning_logs/urls.py
urlpatterns = [
path('topics/', views.topics, name='topics'),
path('topics/<int:topic_id>/', views.topic, name='topic'),
]
۲. ویوها
سپس، توابع ویوی مربوط به این URLها را در learning_logs/views.py پیادهسازی میکنیم.
learning_logs/views.py
from .models import Topic
def topics(request):
"""Show all topics."""
topics = Topic.objects.order_by('date_added')
context = {'topics': topics}
return render(request, 'learning_logs/topics.html', context)
def topic(request, topic_id):
"""Show a single topic and all its entries."""
topic = Topic.objects.get(id=topic_id)
entries = topic.entry_set.order_by('-date_added')
context = {'topic': topic, 'entries': entries}
return render(request, 'learning_logs/topic.html', context)
۳. تمپلیتها
در نهایت، تمپلیتهای topics.html و topic.html را برای نمایش دادهها میسازیم. این
تمپلیتها از base.html ارثبری کرده و با استفاده از تگهای تمپلیت Django، روی دادههای
پاس داده شده (از طریق دیکشنری context) حلقه میزنند.
در این درس، ما با تعریف مدلها، اجرای مهاجرتها و ساخت ویو و تمپلیتهای جدید، اپلیکیشن وبلاگ خود
را به شکل قابل توجهی گسترش دادیم. ما اکنون میتوانیم موضوعات و یادداشتها را در پایگاهداده
ذخیره کرده و آنها را در صفحات وب مجزا نمایش دهیم. در فصل بعدی، به سراغ «ایجاد حساب کاربری در
Django» خواهیم رفت و به کاربران اجازه خواهیم داد تا در سایت ثبتنام کرده و دادههای خود را به
صورت شخصی مدیریت کنند.