مقدمه

اکنون که صفحه اصلی را ساخته‌ایم، باید ساختار داده‌های خود را تعریف کنیم. در Django، داده‌ها با «مدل‌ها» (Models) تعریف می‌شوند. یک مدل، یک کلاس پایتون است که ساختار یک جدول در پایگاه‌داده را توصیف می‌کند. ما دو مدل خواهیم ساخت: Topic برای نگهداری موضوعات وبلاگ، و Entry برای نگهداری یادداشت‌های مربوط به هر موضوع.

Copy Icon 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 ثبت کنیم.

Copy Icon 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 اضافه می‌کنیم.

Copy Icon learning_logs/urls.py
urlpatterns = [
    # ... (index path) ...
    # Page that shows all topics.
    path('topics/', views.topics, name='topics'),
    # Detail page for a single topic.
    path('topics/<int:topic_id>/', views.topic, name='topic'),
]

۲. ویوها

سپس، توابع ویوی مربوط به این URLها را در learning_logs/views.py پیاده‌سازی می‌کنیم.

Copy Icon 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» خواهیم رفت و به کاربران اجازه خواهیم داد تا در سایت ثبت‌نام کرده و داده‌های خود را به صورت شخصی مدیریت کنند.