IlmHamroh
Python kursi/Django6/16-dars16 daqiqa
Mundarija (22)

21.6-dars: View va URL

21-QISM — DJANGO · 6-dars


1. Kirish va motivatsiya

Model ma'lumotni saqlaydi, admin uni boshqaradi. Endi foydalanuvchi so'rovlarini qayta ishlashga o'tami — view va URL. View — so'rovni qabul qilib, javob qaytaruvchi mantiq (MTV ning "V"). URL — so'rovni qaysi view'ga yuborishni belgilaydi. Bu ikki qism — Django ilovasining "harakat qismi".

Har so'rov URL orqali view'ga keladi, view mantiqni bajaradi (ma'lumot oladi, javob shakllaydi). Django ikki xil view beradi: funksiyali (oddiy) va klassli (tuzilgan, qayta ishlatiladigan). URL naqshlari parametrlarni (<int:pk>, <slug:slug>) view'ga uzatadi.

Real vaziyat. Bir jamoa har view'ni funksiya bilan yozdi — CRUD uchun har resurs bo'yicha 5 funksiya, ko'p takror (bir xil naqsh: get, post, ...). Ular klassli view'larga o'tdi: ListView, DetailView — takror kamaydi, kod izchil bo'ldi. Yana URL nomlarini (name="kurs-detal") ishlatdi — endi URL o'zgarsa, kodni tuzatish shart emas (reverse bilan). View va URL to'g'ri tuzilishi kodni toza va saqlanadigan qildi.

Bu darsda view va URL'ni — funksiyali/klassli view, URL naqshlari va parametrlarni o'rganamiz.

Bu darsda:

  • Funksiyali view
  • Klassli view (View)
  • URL naqshlari (path)
  • URL parametrlari (<int:pk>, <slug:slug>)
  • URL nomlari va reverse
  • HTTP metodlarini boshqarish
  • Javob turlari (JsonResponse, HttpResponse)
  • Amaliy: to'liq view/URL tizimi

ℹ Misollarda Django standalone va Client bilan sinaladi.


2. Nazariya — chuqur tushuntirish

2.1. Funksiyali view

Funksiyali view — request qabul qilib, javob qaytaruvchi funksiya:

python
from django.http import JsonResponse

def kurslar(request):
    return JsonResponse({"kurslar": [...]})
Element Ma'no
request So'rov obyekti
return Javob (HttpResponse)
request.method HTTP metod
request.GET So'rov parametrlari

Funksiyali view — eng oddiy: request kiradi, javob chiqadi. request.GET (so'rov parametri), request.method (metod) bilan ishlaydi. Oddiy holatlar uchun ideal.

2.2. Klassli view

Klassli view — HTTP metodlarni metod sifatida:

python
from django.views import View
from django.http import JsonResponse

class KursView(View):
    def get(self, request):
        return JsonResponse({"amal": "o'qish"})

    def post(self, request):
        return JsonResponse({"amal": "yaratish"}, status=201)

Klassli view — har HTTP metod (get, post, put) alohida metod. KursView.as_view() bilan URL'ga ulanadi. Bu tuzilgan (metodlar ajratilgan) va qayta ishlatiladigan (meros). Django tayyor klassli view'lar (ListView, DetailView) ham beradi.

2.3. URL naqshlari (path)

path — URL naqshini view'ga bog'laydi:

python
from django.urls import path
from . import views

urlpatterns = [
    path("kurslar/", views.kurslar),           # /kurslar/
    path("kurslar/<int:pk>/", views.bitta),    # /kurslar/5/
    path("klass/", views.KursView.as_view()),  # klassli view
]

path(naqsh, view) — URL naqshi va view. Funksiyali view to'g'ridan, klassli view .as_view() bilan. urlpatterns — ro'yxat (tartibda tekshiriladi).

2.4. URL parametrlari

URL'dan qiymat olish — burchak qavslar (<>):

python
path("kurslar/<int:pk>/", views.bitta)         # /kurslar/5/ → pk=5
path("kategoriya/<slug:slug>/", views.kat)     # /kategoriya/python/ → slug="python"
path("yil/<int:yil>/oy/<int:oy>/", views.sana) # bir necha parametr
Turi Mos keladi
int Butun son
str Matn (/ dan tashqari)
slug slug (harf, raqam, -, _)
uuid UUID

URL parametri — <turi:nom>. View uni argument sifatida oladi (def bitta(request, pk)). Turi (int, slug) validatsiya qiladi — noto'g'ri format 404.

2.5. URL nomlari va reverse

URL'ga nom berib, koddan havola:

python
path("kurslar/<int:pk>/", views.bitta, name="kurs-detal")

# koddan URL yaratish:
from django.urls import reverse
reverse("kurs-detal", args=[5])                # → "/kurslar/5/"

URL nomi — URL'ni kodddan nom bilan yaratish (reverse). URL naqshi o'zgarsa, kod ishlayveradi (nom o'zgarmaydi). Bu qattiq-kodlangan URL'lardan yaxshiroq (bir joyda o'zgarish).

2.6. HTTP metodlarini boshqarish

View qaysi metodni qabul qilishni belgilaydi:

python
def kurslar(request):
    if request.method == "GET":
        return ...        # o'qish
    elif request.method == "POST":
        return ...        # yaratish

# klassli — avtomatik:
class KursView(View):
    def get(self, request): ...       # faqat GET
    def post(self, request): ...      # faqat POST
    # DELETE → 405 (avtomatik)

Funksiyali view'da request.method bilan qo'lda; klassli view'da metod nomi (get, post) avtomatik. Qo'llabmagan metod → 405 Method Not Allowed (klassli view avtomatik).

2.7. Javob turlari

Django turli javob turlarini beradi:

Javob Content-Type
HttpResponse matn/HTML
JsonResponse JSON
HttpResponseRedirect yo'naltirish (302)
HttpResponse(status=404) status kod
python
from django.http import JsonResponse, HttpResponse

JsonResponse({"kalit": "qiymat"})               # JSON
HttpResponse("<h1>Salom</h1>")                  # HTML
JsonResponse({...}, status=201)                 # status bilan

JsonResponse — API uchun (JSON), HttpResponse — HTML/matn. status bilan status kod 20.6-bob. Django javobni avtomatik shakllaydi (sarlavhalar, kodlash).

2.8. View — MTV ning mantiqi

View — MTV arxitekturasining "mantiq" qismi:

So'rov → URL (yo'naltirish) → View (mantiq) → javob
                                  ↓
                              Model (ma'lumot)
                              Template (HTML)

View — so'rov va javob o'rtasidagi mantiq: model'dan ma'lumot oladi, template bilan HTML shakllaydi (yoki JSON qaytaradi). View yengil bo'lsin (biznes mantiq modelda, 21.3). Bu MTV ajratishi — har qism o'z vazifasi.


3. Tez ma'lumotnoma

python
# FUNKSIYALI VIEW:
from django.http import JsonResponse
def kurslar(request):
    return JsonResponse({"kurslar": [...]})

# KLASSLI VIEW:
from django.views import View
class KursView(View):
    def get(self, request): return JsonResponse({...})
    def post(self, request): return JsonResponse({...}, status=201)

# URL:
from django.urls import path
urlpatterns = [
    path("kurslar/", kurslar, name="kurs-royxat"),
    path("kurslar/<int:pk>/", KursView.as_view(), name="kurs-detal"),
]

# reverse:
from django.urls import reverse
reverse("kurs-detal", args=[5])   # → "/kurslar/5/"

URL parametr turlari

<int:pk> · <str:nom> · <slug:slug> · <uuid:id>

4. Batafsil misollar

Misollarda Django standalone va Client bilan sinaladi.

Misol 1 — Funksiyali va klassli view

python
"""funksiyali view (request→javob); klassli view (get/post metodlari); as_view; 405 (noto'g'ri metod)."""

import warnings
warnings.filterwarnings("ignore")

import sys
import tempfile
import types

import django
from django.conf import settings

settings.configure(
    DEBUG=False,
    DATABASES={"default": {"ENGINE": "django.db.backends.sqlite3", "NAME": ":memory:"}},
    INSTALLED_APPS=["wisar"],
    ROOT_URLCONF=__name__,
    ALLOWED_HOSTS=["*"],
    SECRET_KEY="namuna",
    DEFAULT_AUTO_FIELD="django.db.models.BigAutoField",
)
_app = types.ModuleType("wisar")
_app.__path__ = [tempfile.gettempdir()]
sys.modules["wisar"] = _app
django.setup()

from django.http import JsonResponse
from django.urls import path
from django.views import View


# funksiyali view
def salom(request):
    return JsonResponse({"tur": "funksiya", "metod": request.method})


# klassli view
class KursView(View):
    def get(self, request):
        return JsonResponse({"tur": "klass", "amal": "o'qish"})

    def post(self, request):
        return JsonResponse({"tur": "klass", "amal": "yaratish"}, status=201)


urlpatterns = [
    path("salom/", salom),
    path("kurslar/", KursView.as_view()),
]


def main() -> None:
    from django.test import Client
    client = Client()

    print("=== 1. Funksiyali view ===")
    print(f"  /salom/ → {client.get('/salom/').json()}")

    print("\n=== 2. Klassli view (GET) ===")
    print(f"  GET /kurslar/ → {client.get('/kurslar/').json()}")

    print("\n=== 3. Klassli view (POST) ===")
    javob = client.post("/kurslar/")
    print(f"  POST /kurslar/ → status {javob.status_code}, {javob.json()}")

    print("\n=== 4. Qo'llanmagan metod (405) ===")
    print(f"  DELETE /kurslar/ → status {client.delete('/kurslar/').status_code}")
    print("  ⭐ funksiyali (request→javob); klassli (get/post metod); 405 avtomatik")


if __name__ == "__main__":
    main()

Natijaning muhim qismi:

text
=== 1. Funksiyali view ===
  /salom/ → {'tur': 'funksiya', 'metod': 'GET'}

=== 2. Klassli view (GET) ===
  GET /kurslar/ → {'tur': 'klass', 'amal': "o'qish"}

=== 3. Klassli view (POST) ===
  POST /kurslar/ → status 201, {'tur': 'klass', 'amal': 'yaratish'}

=== 4. Qo'llanmagan metod (405) ===
  DELETE /kurslar/ → status 405
  ⭐ funksiyali (request→javob); klassli (get/post metod); 405 avtomatik

Nima ko'rsatdi: 2.1, 2.2, 2.6-bo'limlar.

Misol 2 — URL parametrlari

python
"""URL parametrlari (<int:pk>, <slug:slug>); view argument; tur validatsiyasi; bir necha parametr."""

import warnings
warnings.filterwarnings("ignore")

import sys
import tempfile
import types

import django
from django.conf import settings

settings.configure(
    DEBUG=False,
    DATABASES={"default": {"ENGINE": "django.db.backends.sqlite3", "NAME": ":memory:"}},
    INSTALLED_APPS=["wisar"],
    ROOT_URLCONF=__name__,
    ALLOWED_HOSTS=["*"],
    SECRET_KEY="namuna",
    DEFAULT_AUTO_FIELD="django.db.models.BigAutoField",
)
_app = types.ModuleType("wisar")
_app.__path__ = [tempfile.gettempdir()]
sys.modules["wisar"] = _app
django.setup()

from django.http import JsonResponse
from django.urls import path


def kurs_bitta(request, pk):
    return JsonResponse({"pk": pk, "tur": type(pk).__name__})


def kategoriya(request, slug):
    return JsonResponse({"slug": slug})


def arxiv(request, yil, oy):
    return JsonResponse({"yil": yil, "oy": oy})


urlpatterns = [
    path("kurslar/<int:pk>/", kurs_bitta),
    path("kategoriya/<slug:slug>/", kategoriya),
    path("arxiv/<int:yil>/<int:oy>/", arxiv),
]


def main() -> None:
    from django.test import Client
    client = Client()

    print("=== 1. int parametr ===")
    javob = client.get("/kurslar/5/").json()
    print(f"  /kurslar/5/ → pk={javob['pk']} ({javob['tur']})")

    print("\n=== 2. slug parametr ===")
    print(f"  /kategoriya/python-asoslari/ → {client.get('/kategoriya/python-asoslari/').json()}")

    print("\n=== 3. Bir necha parametr ===")
    print(f"  /arxiv/2026/9/ → {client.get('/arxiv/2026/9/').json()}")

    print("\n=== 4. Tur validatsiyasi (int'ga matn) ===")
    print(f"  /kurslar/abc/ → status {client.get('/kurslar/abc/').status_code} (int emas)")
    print("  ⭐ <int:pk>/<slug:slug> — view argumenti, tur validatsiyasi")


if __name__ == "__main__":
    main()

Natijaning muhim qismi:

text
=== 1. int parametr ===
  /kurslar/5/ → pk=5 (int)

=== 2. slug parametr ===
  /kategoriya/python-asoslari/ → {'slug': 'python-asoslari'}

=== 3. Bir necha parametr ===
  /arxiv/2026/9/ → {'yil': 2026, 'oy': 9}

=== 4. Tur validatsiyasi (int'ga matn) ===
  /kurslar/abc/ → status 404 (int emas)
  ⭐ <int:pk>/<slug:slug> — view argumenti, tur validatsiyasi

Nima ko'rsatdi: 2.3, 2.4-bo'limlar.

Misol 3 — URL nomlari va reverse

python
"""URL nomlari (name=); reverse (nom→URL); qattiq-kodlangan URL o'rniga nom; URL o'zgarsa kod ishlaydi."""

import warnings
warnings.filterwarnings("ignore")

import sys
import tempfile
import types

import django
from django.conf import settings

settings.configure(
    DEBUG=False,
    DATABASES={"default": {"ENGINE": "django.db.backends.sqlite3", "NAME": ":memory:"}},
    INSTALLED_APPS=["wisar"],
    ROOT_URLCONF=__name__,
    ALLOWED_HOSTS=["*"],
    SECRET_KEY="namuna",
    DEFAULT_AUTO_FIELD="django.db.models.BigAutoField",
)
_app = types.ModuleType("wisar")
_app.__path__ = [tempfile.gettempdir()]
sys.modules["wisar"] = _app
django.setup()

from django.http import JsonResponse
from django.urls import path, reverse


def kurs_royxat(request):
    return JsonResponse({"amal": "ro'yxat"})


def kurs_bitta(request, pk):
    return JsonResponse({"pk": pk})


urlpatterns = [
    path("kurslar/", kurs_royxat, name="kurs-royxat"),
    path("kurslar/<int:pk>/", kurs_bitta, name="kurs-detal"),
]


def main() -> None:
    print("=== 1. reverse (nom → URL) ===")
    print(f"  reverse('kurs-royxat') → {reverse('kurs-royxat')}")

    print("\n=== 2. reverse parametr bilan ===")
    print(f"  reverse('kurs-detal', args=[5]) → {reverse('kurs-detal', args=[5])}")

    print("\n=== 3. Turli parametr ===")
    print(f"  reverse('kurs-detal', args=[42]) → {reverse('kurs-detal', args=[42])}")

    print("\n=== 4. Nom afzalligi ===")
    print("  URL naqshi o'zgarsa, nom o'zgarmaydi — kod ishlayveradi")
    print("  qattiq-kodlangan '/kurslar/5/' o'rniga reverse('kurs-detal', args=[5])")
    print("  ⭐ URL nomi + reverse — koddan URL (qattiq-kodlash emas)")


if __name__ == "__main__":
    main()

Natijaning muhim qismi:

text
=== 1. reverse (nom → URL) ===
  reverse('kurs-royxat') → /kurslar/

=== 2. reverse parametr bilan ===
  reverse('kurs-detal', args=[5]) → /kurslar/5/

=== 3. Turli parametr ===
  reverse('kurs-detal', args=[42]) → /kurslar/42/

=== 4. Nom afzalligi ===
  URL naqshi o'zgarsa, nom o'zgarmaydi — kod ishlayveradi
  qattiq-kodlangan '/kurslar/5/' o'rniga reverse('kurs-detal', args=[5])
  ⭐ URL nomi + reverse — koddan URL (qattiq-kodlash emas)

Nima ko'rsatdi: 2.5-bo'lim.

Misol 4 — Amaliy: to'liq view/URL tizimi

Model bilan ishlovchi to'liq view/URL tizimini quramiz: ro'yxat, bitta, yaratish view'lari, URL parametrlari, nomlari va turli javoblar. Bu — real Django ilovasining view qatlami.

python
"""to'liq tizim: model + view (ro'yxat, bitta, yaratish); URL nomlari; JsonResponse; 404; klassli va funksiyali."""

import warnings
warnings.filterwarnings("ignore")

import json
import sys
import tempfile
import types

import django
from django.conf import settings

settings.configure(
    DEBUG=False,
    DATABASES={"default": {"ENGINE": "django.db.backends.sqlite3", "NAME": ":memory:"}},
    INSTALLED_APPS=["wisar"],
    ROOT_URLCONF=__name__,
    ALLOWED_HOSTS=["*"],
    SECRET_KEY="namuna",
    DEFAULT_AUTO_FIELD="django.db.models.BigAutoField",
)
_app = types.ModuleType("wisar")
_app.__path__ = [tempfile.gettempdir()]
sys.modules["wisar"] = _app
django.setup()

from django.db import connection, models
from django.http import JsonResponse
from django.urls import path
from django.views import View


class Kurs(models.Model):
    nom = models.CharField(max_length=100)
    narx = models.IntegerField()

    class Meta:
        app_label = "wisar"


def kurs_royxat(request):
    kurslar = list(Kurs.objects.values("id", "nom", "narx"))
    return JsonResponse({"kurslar": kurslar})


def kurs_bitta(request, pk):
    try:
        k = Kurs.objects.get(pk=pk)
    except Kurs.DoesNotExist:
        return JsonResponse({"xato": "topilmadi"}, status=404)
    return JsonResponse({"id": k.id, "nom": k.nom, "narx": k.narx})


class KursYaratish(View):
    def post(self, request):
        data = json.loads(request.body)
        k = Kurs.objects.create(nom=data["nom"], narx=data["narx"])
        return JsonResponse({"id": k.id, "nom": k.nom}, status=201)


urlpatterns = [
    path("kurslar/", kurs_royxat, name="kurs-royxat"),
    path("kurslar/yarat/", KursYaratish.as_view(), name="kurs-yarat"),
    path("kurslar/<int:pk>/", kurs_bitta, name="kurs-detal"),
]


def main() -> None:
    with connection.schema_editor() as se:
        se.create_model(Kurs)

    from django.test import Client
    client = Client()

    print("=== 1. Yaratish (POST, klassli) ===")
    javob = client.post("/kurslar/yarat/", data=json.dumps({"nom": "Python", "narx": 100}), content_type="application/json")
    print(f"  status {javob.status_code} → {javob.json()}")
    client.post("/kurslar/yarat/", data=json.dumps({"nom": "Go", "narx": 120}), content_type="application/json")

    print("\n=== 2. Ro'yxat (GET, funksiyali) ===")
    javob = client.get("/kurslar/").json()
    print(f"  kurslar: {[k['nom'] for k in javob['kurslar']]}")

    print("\n=== 3. Bitta (URL parametri) ===")
    print(f"  /kurslar/1/ → {client.get('/kurslar/1/').json()}")

    print("\n=== 4. Topilmadi (404) ===")
    print(f"  /kurslar/999/ → status {client.get('/kurslar/999/').status_code}")
    print("  ⭐ to'liq tizim: model + view (funksiya/klass) + URL (nom, parametr)")


if __name__ == "__main__":
    main()

Natijaning muhim qismi:

text
=== 1. Yaratish (POST, klassli) ===
  status 201 → {'id': 1, 'nom': 'Python'}

=== 2. Ro'yxat (GET, funksiyali) ===
  kurslar: ['Python', 'Go']

=== 3. Bitta (URL parametri) ===
  /kurslar/1/ → {'id': 1, 'nom': 'Python', 'narx': 100}

=== 4. Topilmadi (404) ===
  /kurslar/999/ → status 404
  ⭐ to'liq tizim: model + view (funksiya/klass) + URL (nom, parametr)

Nima ko'rsatdi: 2.1–2.8-bo'limlar.


5. To'g'ri va noto'g'ri tushunishlar

Noto'g'ri fikr To'g'risi
"View — faqat funksiya" Klassli ham
"URL parametri matn" Tur bilan (int, slug)
"URL'ni qattiq-kodlash" Nom + reverse
"Metodni tekshirish qo'lda" Klassli — avtomatik
"View — JSON faqat" HTML, redirect ham
"Biznes mantiq view'da" Modelda (view yengil)
"as_view keraksiz" Klassli view uchun shart
"URL tartibi muhim emas" Tartibda tekshiriladi

6. Keng tarqalgan xatolar va yechimlari

1. Klassli view'da as_view() unutish

python
path("kurslar/", KursView)                   # ❌ funksiya kutadi
path("kurslar/", KursView.as_view())         # ✅

2. URL parametri turini bermaslik

python
path("kurslar/<pk>/", views.bitta)           # str (validatsiyasiz)
path("kurslar/<int:pk>/", views.bitta)       # ✅ int

3. URL'ni qattiq-kodlash

python
return redirect("/kurslar/5/")               # ⚠️ o'zgarsa buziladi
return redirect(reverse("kurs-detal", args=[5]))   # ✅

4. request.methodni tekshirmaslik (funksiyali)

python
def kurslar(request): saqla(request.POST)    # ⚠️ GET'da ham
if request.method == "POST": ...             # ✅

5. View argumentida parametr yo'q

python
def bitta(request):                          # ❌ pk kutiladi
def bitta(request, pk):                      # ✅

6. Biznes mantiqni view'da

python
def kurslar(request):
    # murakkab hisob-kitob view'da              # ⚠️
    # ✅ model metodida (view faqat so'rov→javob)

7. JsonResponsega ro'yxat (xavfsizlik)

python
JsonResponse([1, 2, 3])                       # ⚠️ safe=False kerak
JsonResponse({"data": [1, 2, 3]})             # ✅ dict

7. Integratsiya — bu bilim qayerda kerak bo'ladi

  • 21.2-dars (o'tilgan): URL — include, app URL'lari
  • 21.7-dars: template — view HTML qaytaradi
  • 21.8-dars: forma — view forma boshqaradi
  • 20.4-dars (o'tilgan): FastAPI route — taqqoslash
  • 21.12-dars: DRF — API view'lar

8. Eng yaxshi amaliyotlar

  1. Oddiy holatda funksiyali, murakkabda klassli view.

  2. URL parametrlariga tur bering (<int:pk>).

  3. URL'larga nom bering va reverse ishlating.

  4. Klassli view'da as_view() ni unutmang.

  5. Biznes mantiqni modelda qoldiring (view yengil).

  6. To'g'ri javob turi (JsonResponse API, HttpResponse HTML).

  7. HTTP metodlarini to'g'ri boshqaring (405).

  8. get_object_or_404 bilan topilmadi holatini soddalashtiring.


9. Amaliy topshiriq

Vazifa 1: Bashorat qiling

python
1.  # view nima?
2.  # funksiyali va klassli view farqi?
3.  # path nima?
4.  # <int:pk> nima?
5.  # as_view nima uchun?
6.  # reverse nima qiladi?
7.  # URL nomi nima uchun?
8.  # 405 qachon?
9.  # request.GET nima?
10. # JsonResponse nima?
11. # biznes mantiq qayerda?
12. # URL tartibi muhimmi?
Javoblar
  1. So'rovni qabul qilib javob qaytaruvchi mantiq
  2. Funksiyali — funksiya, klassli — metodlar (get/post)
  3. URL naqshini view'ga bog'laydi
  4. int URL parametri (view argumenti)
  5. Klassli view'ni funksiyaga aylantiradi (URL uchun)
  6. Nomdan URL yaratadi
  7. Kodddan URL (qattiq-kodlash emas)
  8. Qo'llabmagan HTTP metod
  9. So'rov parametrlari (?til=uz)
  10. JSON javob
  11. Modelda (view yengil)
  12. Ha (tartibda tekshiriladi)

Vazifa 2: Xatolarni tuzating

python
1.  path("kurslar/", KursView)           # as_view

2.  path("kurslar/<pk>/", views.bitta)   # tur

3.  return redirect("/kurslar/5/")       # qattiq-kod

4.  def kurslar(request): saqla(...)     # metod

5.  def bitta(request):                  # parametr
Javoblar
python
1.  path("kurslar/", KursView.as_view())

2.  path("kurslar/<int:pk>/", views.bitta)

3.  return redirect(reverse("kurs-detal", args=[5]))

4.  if request.method == "POST": saqla(...)

5.  def bitta(request, pk):

Vazifa 3: CRUD view'lar

Kurs uchun view'lar:

  1. Ro'yxat (GET), bitta (GET + 404)
  2. Yaratish (POST, klassli), o'chirish (DELETE)
  3. URL nomlari
  4. Client bilan test

Vazifa 4: URL parametrlari

Turli parametrlar:

  1. int, slug, bir necha parametr
  2. Har biri uchun view
  3. Tur validatsiyasi (404)
  4. Test

Vazifa 5: reverse va nom

URL nomlari bilan:

  1. Barcha URL'ga nom
  2. reverse bilan kodddan URL
  3. Redirect reverse bilan
  4. URL o'zgarsa ishlashini ko'rsatish

Vazifa 6: Funksiyali vs klassli

Bir resursni ikki usulda:

  1. Funksiyali view (metod tekshiruvi bilan)
  2. Klassli view (get/post metodlari)
  3. Taqqoslash
  4. Har biri test

Vazifa 7: O'ylash

URL nomlari va reverse qattiq-kodlangan URL'lardan (/kurslar/5/) qutuladi: URL kodddan nom bilan yaratiladi, va URL naqshi o'zgarsa, kod ishlayveradi. Bu 20.16 dagi "yagona manba" va umuman "takrorni yo'qotish" (DRY) tamoyiliga o'xshaydi. URL'ni bir joyda (naqsh) aniqlab, hamma joyda nom bilan ishlatishning afzalligi nima, va "qattiq-kodlashdan qochish" tamoyili qayerda yana muhim?

Javob

Qisqa javob: URL nomi — URL'ni bir joyda (URL naqshi) aniqlab, hamma joyda nom bilan ishlatish. Agar URL o'zgarsa (/kurslar/ → /courses/), faqat naqsh o'zgaradi — barcha reverse("kurs-royxat") ishlayveradi. Qattiq-kodlangan /kurslar/5/ bo'lsa, URL o'zgarganda har joyda qo'lda tuzatish kerak (biror joyni unutsa, buziladi). "Qattiq-kodlashdan qochish" — qiymatni bir joyda aniqlab, nom/o'zgaruvchi bilan ishlatish — DRY tamoyili: takror yo'q, o'zgarish bir joyda.

1. Qattiq-kod vs nom

Qattiq-kod (yomon) Nom (yaxshi)
/kurslar/5/ reverse("kurs-detal", args=[5])
Har joyda takror Bir joyda (naqsh)
O'zgarsa buziladi O'zgarsa ishlayveradi

2. Afzalliklar

Afzallik Sabab
Bir joyda o'zgarish URL naqshida
Xatosiz Unutish yo'q
O'qiladigan Nom ma'noli
Saqlash oson Takror yo'q

3. Qattiq-kodlashdan qochish (DRY)

Qiymat (URL, konstanta, sozlama) bir joyda aniqlansin, hamma joyda unga havola (nom, o'zgaruvchi). Takrorlangan qiymat — o'zgarishda xato manbai.

4. "Qattiq-kodlashdan qochish" boshqa joyda

Qattiq-kod Yechim
URL /kurslar/5/ reverse (nom)
Sehrli son 86400 Konstanta KUN_SONIYA
Takror satr O'zgaruvchi
Sozlama kodda Konfiguratsiya/.env

5. Muhandislik saboqlari

  1. Qiymatni bir joyda aniqla (naqsh, konstanta)
  2. Hamma joyda nom/havola bilan ishlat
  3. Qattiq-kod — o'zgarishda xato manbai
  4. DRY — takror yo'q, o'zgarish bir joyda

6. Xulosa

  1. URL nomi — bir joyda aniqlash, nom bilan ishlatish
  2. URL o'zgarsa — kod ishlayveradi (reverse)
  3. Qattiq-kodlashdan qochish — DRY
  4. Tamoyil keng (URL, konstanta, sozlama)

Nimani mustahkamlaydi: 2.1–2.8-bo'limlar.


Xulosa

Bu darsda Django view va URL'ni o'rgandik.

Eng muhim uch fikr:

  1. Funksiyali va klassli view. View — so'rovni qabul qilib javob qaytaruvchi mantiq (MTV ning "V"). Funksiyali view — request kiradi, javob chiqadi (request.method, request.GET bilan) — oddiy holatlar uchun. Klassli view — har HTTP metod (get, post) alohida metod, .as_view() bilan URL'ga ulanadi — tuzilgan, qayta ishlatiladigan (Django ListView, DetailView beradi). Qo'llabmagan metod → 405 (klassli avtomatik).

  2. URL naqshlari va parametrlar. path(naqsh, view) — URL'ni view'ga bog'laydi. URL parametrlari <turi:nom> bilan (<int:pk>, <slug:slug>) view'ga argument sifatida uzatiladi; turi (int, slug) validatsiya qiladi (noto'g'ri format → 404). urlpatterns tartibda tekshiriladi.

  3. URL nomlari va yengil view. URL'ga nom berib (name="kurs-detal"), kodddan reverse("kurs-detal", args=[5]) bilan URL yaratiladi — qattiq-kodlangan /kurslar/5/ o'rniga. URL naqshi o'zgarsa, kod ishlayveradi (DRY, "qattiq-kodlashdan qochish"). View yengil bo'lsin — biznes mantiq modelda 21.3-bob, view faqat so'rov→javob boshqaruvi. Javob turi: JsonResponse (API), HttpResponse (HTML), status bilan status kod.

Keyingi darsda template ni o'rganamiz: Django template tili bilan HTML shakllash — o'zgaruvchilar, sikllar, shartlar, template meros va view bilan bog'lash.

Ulashish:Telegram'da

Izohlar (0)

Izoh yozish uchun kiring.

  • Hozircha izoh yo'q. Birinchi bo'ling!
21.6-dars: View va URL — IlmHamroh