Slug maydonini qo‘shish
Slug nima?
Quyidagi kabi URL manzillarni ko‘rganmisiz:
w3schools.com/django/learn-about-slug-field
"learn-about-slug-field" qismi slug hisoblanadi.
Bu faqat harflar, defislar, raqamlar yoki pastki chiziqlardan iborat tavsif.
U ko‘pincha URL manzillarni o‘qishni osonlashtirish, shuningdek ularni qidiruv tizimlari uchun qulayroq qilish maqsadida ishlatiladi.
Slug’siz URL
Agar ushbu darslikda yaratilgan Django loyihamizni bosqichma-bosqich bajargan bo‘lsangiz, sizda quyidagi ko‘rinishdagi kichik Django loyihasi bo‘ladi:

Birinchi a’zoni bossangiz, quyidagi sahifaga o‘tasiz:

Manzil satriga qarang:
127.0.0.1:8000/members/details/1
"1" raqami ma’lumotlar bazasidagi aynan shu yozuvning ID raqamini bildiradi.
Bu dasturchi uchun tushunarli, ammo boshqalar uchun, ehtimol, tushunarsiz.
Slug’li URL
Agar URL quyidagicha ko‘rinsa, ancha tushunarliroq bo‘lardi:

Manzil satriga qarang:
127.0.0.1:8000/members/details/emil-refsnes
Bu foydalanuvchi uchun qulayroq URL va Django loyihangizda shunday URL manzillarni yaratishga yordam bera oladi.
models.py faylini o‘zgartirish
Avval ma’lumotlar bazasiga yangi maydon qo‘shing.
models.py faylini oching va SlugField ma’lumot tipidagi slug nomli maydon qo‘shing:
my_tennis_club/members/models.py:
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}"
Bu model tuzilishidagi o‘zgarish, shuning uchun Django’ga ma’lumotlar bazasini yangilash kerakligini bildirish uchun migratsiya yaratishimiz kerak:
python manage.py makemigrations
Va migrate buyrug‘ini bajaring:
python manage.py migrate
Admin panelini o‘zgartirish
Endi ma’lumotlar bazasida yangi maydon bor, ammo biz a’zoning firstname yoki lastname qiymatini belgilaganimizda bu maydon avtomatik yangilanishini ham istaymiz.
Buni Django’ning prepopulated_fields deb nomlangan o‘rnatilgan imkoniyati yordamida amalga oshirish mumkin: unda oldindan to‘ldirmoqchi bo‘lgan maydonni va uni to‘ldirish uchun ishlatiladigan maydon(lar)dan iborat tuple’ni ko‘rsatasiz.
Bu admin.py faylida amalga oshiriladi:
my_tennis_club/members/admin.py:
from django.contrib import admin
from .models import Member
# Register your models here.
class MemberAdmin(admin.ModelAdmin):
list_display = ("firstname", "lastname", "joined_date",)
prepopulated_fields = {"slug": ("firstname", "lastname")}
admin.site.register(Member, MemberAdmin)
Admin interfeysiga kiring va biror yozuvni tahrirlash uchun oching:

"SAVE" tugmasini bosing — "slug" maydoni firstname va lastname qiymatlari bilan avtomatik to‘ldiriladi. "slug" maydoni SlugField tipida bo‘lgani uchun u qiymatni "slugify" qiladi, ya’ni har bir so‘z orasiga defis qo‘yadi.
Keyingi safar a’zoni tahrirlash uchun ochganingizda slug maydonini qiymati bilan ko‘rasiz:

Eslatma: Yangi maydon sukut bo‘yicha bo‘sh bo‘lgani uchun bu saqlash amalini har bir a’zo uchun bajarishingiz kerak.
Shablonni o‘zgartirish
Endi butun loyiha bo‘ylab ID maydonini slug maydoni bilan almashtirishimiz mumkin.
Tafsilotlar sahifasiga havola joylashgan all_members.html shablonidan boshlang:
my_tennis_club/members/templates/all_members.html:
{% 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 %}
URL’ni o‘zgartirish
Shuningdek, urls.py fayliga ham ba’zi o‘zgartirishlar kiritishimiz kerak.
<int:id> o‘rniga <slug:slug> yozing:
my_tennis_club/members/urls.py:
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'),
]
View’ni o‘zgartirish
Nihoyat, kiruvchi so‘rovni ID o‘rniga slug orqali qayta ishlashi uchun details view’ini o‘zgartiring:
my_tennis_club/members/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))
Endi tafsilotlar sahifasiga olib boruvchi havola yangi, slug asosidagi URL bilan ishlaydi:

Agar barcha qadamlarni o‘z kompyuteringizda bajargan bo‘lsangiz, natijani o‘z brauzeringizda ko‘rishingiz mumkin: 127.0.0.1:8000/members/.
Agar server to‘xtagan bo‘lsa, uni runserver buyrug‘i bilan qayta ishga tushirishingiz kerak:
python manage.py runserver
W3Schools Pathfinder
Yutuqlaringizni kuzating – bu bepul!
