Mundarija (22)
- 1. Kirish va motivatsiya
- 2. Nazariya — chuqur tushuntirish
- 2.1. Funksiyali view
- 2.2. Klassli view
- 2.3. URL naqshlari (path)
- 2.4. URL parametrlari
- 2.5. URL nomlari va reverse
- 2.6. HTTP metodlarini boshqarish
- 2.7. Javob turlari
- 2.8. View — MTV ning mantiqi
- 3. Tez ma'lumotnoma
- 4. Batafsil misollar
- Misol 1 — Funksiyali va klassli view
- Misol 2 — URL parametrlari
- Misol 3 — URL nomlari va reverse
- Misol 4 — Amaliy: to'liq view/URL tizimi
- 5. To'g'ri va noto'g'ri tushunishlar
- 6. Keng tarqalgan xatolar va yechimlari
- 7. Integratsiya — bu bilim qayerda kerak bo'ladi
- 8. Eng yaxshi amaliyotlar
- 9. Amaliy topshiriq
- Xulosa
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
Clientbilan sinaladi.
2. Nazariya — chuqur tushuntirish
2.1. Funksiyali view
Funksiyali view — request qabul qilib, javob qaytaruvchi funksiya:
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:
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:
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 (<>):
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:
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:
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 |
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
# 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
Clientbilan sinaladi.
Misol 1 — Funksiyali va klassli view
"""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:
=== 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 avtomatikNima ko'rsatdi: 2.1, 2.2, 2.6-bo'limlar.
Misol 2 — URL parametrlari
"""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:
=== 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 validatsiyasiNima ko'rsatdi: 2.3, 2.4-bo'limlar.
Misol 3 — URL nomlari va reverse
"""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:
=== 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.
"""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:
=== 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
path("kurslar/", KursView) # ❌ funksiya kutadi
path("kurslar/", KursView.as_view()) # ✅2. URL parametri turini bermaslik
path("kurslar/<pk>/", views.bitta) # str (validatsiyasiz)
path("kurslar/<int:pk>/", views.bitta) # ✅ int3. URL'ni qattiq-kodlash
return redirect("/kurslar/5/") # ⚠️ o'zgarsa buziladi
return redirect(reverse("kurs-detal", args=[5])) # ✅4. request.methodni tekshirmaslik (funksiyali)
def kurslar(request): saqla(request.POST) # ⚠️ GET'da ham
if request.method == "POST": ... # ✅5. View argumentida parametr yo'q
def bitta(request): # ❌ pk kutiladi
def bitta(request, pk): # ✅6. Biznes mantiqni view'da
def kurslar(request):
# murakkab hisob-kitob view'da # ⚠️
# ✅ model metodida (view faqat so'rov→javob)7. JsonResponsega ro'yxat (xavfsizlik)
JsonResponse([1, 2, 3]) # ⚠️ safe=False kerak
JsonResponse({"data": [1, 2, 3]}) # ✅ dict7. 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
Oddiy holatda funksiyali, murakkabda klassli view.
URL parametrlariga tur bering (
<int:pk>).URL'larga nom bering va
reverseishlating.Klassli view'da
as_view()ni unutmang.Biznes mantiqni modelda qoldiring (view yengil).
To'g'ri javob turi (
JsonResponseAPI,HttpResponseHTML).HTTP metodlarini to'g'ri boshqaring (405).
get_object_or_404bilan topilmadi holatini soddalashtiring.
9. Amaliy topshiriq
Vazifa 1: Bashorat qiling
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
- So'rovni qabul qilib javob qaytaruvchi mantiq
- Funksiyali — funksiya, klassli — metodlar (get/post)
- URL naqshini view'ga bog'laydi
- int URL parametri (view argumenti)
- Klassli view'ni funksiyaga aylantiradi (URL uchun)
- Nomdan URL yaratadi
- Kodddan URL (qattiq-kodlash emas)
- Qo'llabmagan HTTP metod
- So'rov parametrlari (
?til=uz) - JSON javob
- Modelda (view yengil)
- Ha (tartibda tekshiriladi)
Vazifa 2: Xatolarni tuzating
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): # parametrJavoblar
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:
- Ro'yxat (GET), bitta (GET + 404)
- Yaratish (POST, klassli), o'chirish (DELETE)
- URL nomlari
Clientbilan test
Vazifa 4: URL parametrlari
Turli parametrlar:
int,slug, bir necha parametr- Har biri uchun view
- Tur validatsiyasi (404)
- Test
Vazifa 5: reverse va nom
URL nomlari bilan:
- Barcha URL'ga nom
reversebilan kodddan URL- Redirect
reversebilan - URL o'zgarsa ishlashini ko'rsatish
Vazifa 6: Funksiyali vs klassli
Bir resursni ikki usulda:
- Funksiyali view (metod tekshiruvi bilan)
- Klassli view (get/post metodlari)
- Taqqoslash
- 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
- Qiymatni bir joyda aniqla (naqsh, konstanta)
- Hamma joyda nom/havola bilan ishlat
- Qattiq-kod — o'zgarishda xato manbai
- DRY — takror yo'q, o'zgarish bir joyda
6. Xulosa
- URL nomi — bir joyda aniqlash, nom bilan ishlatish
- URL o'zgarsa — kod ishlayveradi (
reverse) - Qattiq-kodlashdan qochish — DRY
- 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:
Funksiyali va klassli view. View — so'rovni qabul qilib javob qaytaruvchi mantiq (MTV ning "V"). Funksiyali view —
requestkiradi, javob chiqadi (request.method,request.GETbilan) — oddiy holatlar uchun. Klassli view — har HTTP metod (get,post) alohida metod,.as_view()bilan URL'ga ulanadi — tuzilgan, qayta ishlatiladigan (DjangoListView,DetailViewberadi). Qo'llabmagan metod →405(klassli avtomatik).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).urlpatternstartibda tekshiriladi.URL nomlari va yengil view. URL'ga nom berib (
name="kurs-detal"), kodddanreverse("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),statusbilan 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.
Izohlar (0)
Izoh yozish uchun kiring.
- Hozircha izoh yo'q. Birinchi bo'ling!