اگر شما در حال کار با چارچوب جنگو هستید، احتمالاً به دیتابیس پروژه خود دسترسی دارید و از مدلها استفاده میکنید. در بسیاری از پروژهها نیاز است که هر شیء خاصی (مثلاً هر کدام از پستهای وبلاگ) قابل لینکدهی به صفحه جزئیات خود باشند. این رضایت کاربران را بالا میبرد و امکان مانور بیشتری روی دادهها فراهم میآورد.
برای افزودن لینک به جزئیات در جنگو، نیاز است که ابتدا یک URL برای مسیر جزئیات تنظیم کنید. این فرایند معمولاً شامل تعریف یک الگو در فایل urls.py و ایجاد یک ویو برای نمایش جزئیات میشود. همچنین باید قالب مناسب برای نمایش جزئیات ایجاد کنید.
بیایید با یک مثال ساده از یک مدل پست وبلاگ شروع کنیم. در اینجا میخواهیم یک لینک جزئیات تنظیم کنیم که به صفحهای میبرد که اطلاعات کامل پست را نمایش میدهد.
یک نمونه ساده از مدل پست در جنگو ممکن است شامل عنوان و محتوا باشد. ما نیاز داریم که URL جزئیات این پستها را بر اساس شناسه یا ویژگی دیگری مانند slug تعریف کنیم.
با این کار، کاربران میتوانند روی لینکی از لیست پستها کلیک کنند تا جزئیات بیشتری در مورد هر یک بخوانند. این کاربرد فقط محدود به وبلاگ نیست و در بسیاری از بخشهای وب، مثل لیست محصول، اعضای تیم و غیره قابل استفاده است.
مثال کد
# models.py
from django.db import models
class BlogPost(models.Model):
title = models.CharField(max_length=200)
content = models.TextField()
slug = models.SlugField(unique=True)
def __str__(self):
return self.title
def get_absolute_url(self):
return reverse('post_detail', kwargs={'slug': self.slug})
# urls.py
from django.urls import path
from .views import PostDetailView
urlpatterns = [
path('post//', PostDetailView.as_view(), name='post_detail'),
]
# views.py
from django.views.generic import DetailView
from .models import BlogPost
class PostDetailView(DetailView):
model = BlogPost
template_name = 'post_detail.html'
# template (post_list.html)
{% for post in posts %}
{{ post.title }}
{{ post.content|truncatewords:30 }}
{% endfor %}
ساختار کد
# models.py
این فایل تعریف مدل دیتابیس را برعهده دارد. در اینجا مدل BlogPost را داریم.
from django.db import models
ماژول مدلها از جنگو را وارد میکنیم.
class BlogPost(models.Model):
مدلی به نام BlogPost ایجاد میکنیم که اعضای آن عنوان و محتوا است.
slug = models.SlugField(unique=True)
یک فیلد غیرتکراری برای slug داریم که برای لینک دهی استفاده میشود.
def get_absolute_url(self):
تابعی برای دریافت URL کامل جزئیات ایجاد میکنیم.
# urls.py
در این فایل، مسیر URL جزئیات را تعریف میکنیم.
path('post//', PostDetailView.as_view(), name='post_detail'),
مسیر جزئیات پستها با استفاده از slug تنظیم میشود.
# views.py
در این فایل، کلاس ویو برای جزئیات را داریم.
class PostDetailView(DetailView):
یک ویو جزئیات بر اساس مدل BlogPost داریم.
# template (post_list.html)
قالب نمایش لیست پستها، که لینک به جزئیات هر پست در آن قرار میگیرد.
{% for post in posts %}
یک حلقه برای نمایش هر پست در لیست اجرا میشود.
{{ post.get_absolute_url }}
URL جزئیات هر پست را با تابع get_absolute_url میگیریم.