افزودن فیلد slug (Add Slug Field)
«اسلاگ (Slug)» متنِ کوتاهِ آدرس پسند است. فقط حروف، اعداد و خط تیره دارد. با اسلاگ، URL خواناتر می شود و جست وجو بهتر می فهمد. اینجا اسلاگ را به مدل «Member» اضافه می کنیم و همه چیز را با URL جدید هماهنگ می کنیم.
افزودن فیلد اسلاگ به مدل
در models.py یک فیلد SlugField اضافه کن. اسلاگ شناسه خواناست؛ مثل نام دانش آموز به جای شماره.
from django.db import models
class Member(models.Model):
firstname = models.CharField(max_length=255)
lastname = models.CharField(max_length=255)
phone = models.IntegerField(null=True)
joined_date = models.DateField(null=True)
slug = models.SlugField(default="", null=False)
def __str__(self):
return f"{self.firstname} {self.lastname}"
اجرای مهاجرت دیتابیس
ساختار مدل عوض شد. بنابراین باید مایگریشن بسازی و اعمال کنی.
python manage.py makemigrations
python manage.py migrate
پیش پر کردن اسلاگ در ادمین
می خواهیم اسلاگ از نام و نام خانوادگی پر شود. از prepopulated_fields استفاده کن.
from django.contrib import admin
from .models import Member
class MemberAdmin(admin.ModelAdmin):
list_display = ("firstname", "lastname", "joined_date")
prepopulated_fields = {"slug": ("firstname", "lastname")}
admin.site.register(Member, MemberAdmin)
نکته: رکوردهای قدیمی خالی هستند. هر کدام را یک بار ذخیره کن تا اسلاگ ساخته شود.
استفاده از اسلاگ در قالب
در قالب لیست اعضا، لینک را با اسلاگ بساز. این مانند نام دانش آموز در آدرس است.
{% extends "master.html" %}
{% block title %}
My Tennis Club - List of all members
{% endblock %}
{% block content %}
<div class="mycard">
<h1>Members</h1>
<ul>
{% for x in mymembers %}
<li onclick="window.location = 'details/{{ x.slug }}'">{{ x.firstname }} {{ x.lastname }}</li>
{% endfor %}
</ul>
</div>
{% endblock %}
تغییر الگوی آدرس ها
در urls.py به جای <int:id> از <slug:slug> استفاده کن.
from django.urls import path
from . import views
urlpatterns = [
path('', views.main, name='main'),
path('members/', views.members, name='members'),
path('members/details/<slug:slug>', views.details, name='details'),
path('testing/', views.testing, name='testing'),
]
نمایش جزئیات با اسلاگ
در views.py عضو را با اسلاگ بگیر. سپس قالب جزئیات را رندر کن.
from django.http import HttpResponse
from django.template import loader
from .models import Member
def members(request):
mymembers = Member.objects.all().values()
template = loader.get_template('all_members.html')
context = {
'mymembers': mymembers,
}
return HttpResponse(template.render(context, request))
def details(request, slug):
mymember = Member.objects.get(slug=slug)
template = loader.get_template('details.html')
context = {
'mymember': mymember,
}
return HttpResponse(template.render(context, request))
def main(request):
template = loader.get_template('main.html')
return HttpResponse(template.render())
def testing(request):
template = loader.get_template('template.html')
context = {
'fruits': ['Apple', 'Banana', 'Cherry'],
}
return HttpResponse(template.render(context, request))
اجرای سرور و بررسی
اگر سرور خاموش است، دوباره اجرا کن. سپس آدرس اعضا را باز کن و URL اسلاگ دار را ببین.
python manage.py runserver
جمع بندی سریع
- اسلاگ، آدرس را خواناتر می کند.
- فیلد اسلاگ را به مدل اضافه کن.
- در ادمین، پیش پر کردن را فعال کن.
- URL ها را به اسلاگ تغییر بده.
- ویو جزئیات با اسلاگ کار کند.
برای مرور، راهنمای فیلد اسلاگ را ببین. همچنین برای استقرار، فصل استقرار با EB را بررسی کن.