Barcha kurslar Yo'nalishlar Reyting Kirish Ro'yxatdan o'tish

Bu modul Django’ning yuragini ochdi: brauzerdan kelgan so’rov URL orqali qanday qilib view funksiyasiga yetib boradi va u javobni qanday qaytaradi.

URL va View nima?

Har bir so’rov ikki savolga javob talab qiladi: qayerga keldi (URL) va nima qilish kerak (view). Django’da bu ikkisi aniq ajratilgan: urls.py — manzillar jadvali, views.py — o’sha manzillarga biriktirilgan Python funksiyalar. So’rov-javob sikli: brauzer /darslar/python so’raydi → Django URL jadvalidan mosini topadi → bog’langan view ishlaydi → view HttpResponse qaytaradi → brauzer uni ko’rsatadi.

Birinchi view va URL

View — so’rov (request) obyektini qabul qilib, javob qaytaradigan oddiy funksiya:

# darslar/views.py
from django.http import HttpResponse

def bosh_sahifa(request):
    return HttpResponse("Darslar bo'limiga xush kelibsiz!")

App ichida o’z URL jadvali tuziladi:

# darslar/urls.py (yangi fayl)
from django.urls import path
from . import views

urlpatterns = [
    path("", views.bosh_sahifa),
]

Va loyihaning bosh jadvaliga include bilan ulanadi:

# loyiha urls.py
from django.urls import path, include

urlpatterns = [
    path("darslar/", include("darslar.urls")),
]

Endi http://127.0.0.1:8000/darslar/ manzili view’dagi matnni qaytaradi. Tez-tez uchraydigan xato: view’dan satrni to’g’ridan-to’g’ri return "matn" qilib qaytarish — Django HttpResponse (yoki uning avlodi) kutadi, aks holda ValueError beradi.

Dinamik URL segmentlari

Har bir dars uchun alohida path yozib chiqish o’rniga URL’ning bir qismi o’zgaruvchan qilinadi:

urlpatterns = [
    path("<str:mavzu>", views.dars_sahifasi),
]
def dars_sahifasi(request, mavzu):
    return HttpResponse(f"Siz tanlagan mavzu: {mavzu}")

/darslar/python so’ralsa, mavzu parametri "python" qiymatini oladi.

Natija:

Siz tanlagan mavzu: python

Path converter’lar

Segment turini converter belgilaydi — u qiymatni tekshiradi va view’ga tayyor turda uzatadi:

Converter Nimani qabul qiladi View’da turi
str / dan boshqa istalgan matn str
int Faqat butun son int
slug Harf, raqam, - va _ str
path / ni ham o’z ichiga olgan yo’l str

Masalan path("<int:oy>", views.oylik_dars) bilan /darslar/3 ishlaydi, /darslar/mart esa mos kelmaydi — converter noto’g’ri turdagi so’rovni view’ga yetkazmaydi.

Dinamik view logikasi

View ichida odatiy Python ishlaydi — lug’atdan qiymat olish, shartlar, xatoni ushlash:

from django.http import HttpResponse, HttpResponseNotFound

darslar = {
    "python": "Python — universal dasturlash tili.",
    "django": "Django — Python veb-freymvorki.",
}

def dars_sahifasi(request, mavzu):
    if mavzu not in darslar:
        return HttpResponseNotFound("Bunday dars topilmadi.")
    return HttpResponse(darslar[mavzu])

Mavjud bo’lmagan mavzu so’ralsa, foydalanuvchi 500 xato o’rniga tushunarli 404 javob oladi.

Redirect — yo’naltirish

Ba’zan javob berish emas, boshqa manzilga uzatish kerak (masalan, eski URL yangi manzilga ko’chgan bo’lsa):

from django.http import HttpResponseRedirect

def eski_manzil(request):
    return HttpResponseRedirect("/darslar/python")

Brauzer 302 javobini olib, ko’rsatilgan manzilga o’zi o’tadi.

reverse va nomlangan URL’lar

Kodga /darslar/python kabi manzilni qattiq yozib qo’yish xavfli: URL o’zgarsa, uni ishlatgan har bir joyni qidirib tuzatishga to’g’ri keladi. Yechim — marshrutga nom berish:

urlpatterns = [
    path("<str:mavzu>", views.dars_sahifasi, name="dars-sahifasi"),
]

va manzilni nomdan hosil qilish:

from django.urls import reverse
from django.http import HttpResponseRedirect

def eski_manzil(request):
    yangi = reverse("dars-sahifasi", args=["python"])  # /darslar/python
    return HttpResponseRedirect(yangi)

Endi URL sxemasi o’zgarsa ham reverse har doim to’g’ri manzilni qaytaradi. Tez-tez uchraydigan xato — NoReverseMatch: nom xato yozilgan yoki kerakli argument berilmagan; xato matnida qaysi nom topilmagani aniq ko’rsatiladi.

HTML qaytarish

HttpResponse ichiga HTML ham yozish mumkin:

def dars_sahifasi(request, mavzu):
    javob = f"<h1>{mavzu.capitalize()}</h1><p>{darslar[mavzu]}</p>"
    return HttpResponse(javob)

Lekin bu yo’l tez chegaraga uriladi: HTML Python satrlari ichida o’qib bo’lmas holga keladi, dizaynni o’zgartirish og’irlashadi. To’g’ri yechim — HTML’ni alohida fayllarga ajratish, ya’ni template’lar; bu keyingi modulning mavzusi.

Amaliyot

  1. mashqlar app’ida /mashqlar/salom manzili "Salom!" qaytaradigan view yozing.
  2. <str:ism> segmenti bilan /mashqlar/salom/Aziz ko’rinishidagi manzil "Salom, Aziz!" qaytarsin.
  3. Oylar lug’atini tuzing ({1: "Yanvar", ...}) va <int:raqam> bilan /mashqlar/oy/3 so’ralganda oy nomini qaytaring; mavjud bo’lmagan raqamga HttpResponseNotFound bering.
  4. Marshrutlarga name bering va /mashqlar/hozirgi-oy manzili reverse yordamida joriy oy sahifasiga redirect qilsin.
  5. Oy sahifasi javobini <h1> sarlavha va <p> matnli HTML ko’rinishiga keltiring.

Modul materialini quyidagi test orqali mustahkamlang.

URL’lar va View’lar — konspekt

URL'lar va View'lar Maqola

View funksiyalari, URL marshrutlash, dinamik segmentlar va path converter’lar, redirect, reverse va nomlangan URL’lar — Django’ning asosiy mexanizmi bo’yicha konspekt.

Eslatma yozish uchun saytga kiring.

Resurslar hozircha qo'shilmagan

O'qituvchi dars uchun qo'shimcha materiallarni qo'shganida shu yerda paydo bo'ladi.

Savol berish uchun saytga kiring.

Hozircha savollar yo'q

Bu dars yuzasidan birinchi savolni siz bering.