Mundarija (22)
- 1. Kirish va motivatsiya
- 2. Nazariya — chuqur tushuntirish
- 2.1. Admin'ga ro'yxatdan o'tkazish
- 2.2. ModelAdmin sozlamalari
- 2.3. list_display (ustunlar)
- 2.4. list_filter va search_fields
- 2.5. ordering va sahifalash
- 2.6. Maydonlarni tahrirlash
- 2.7. @admin.register dekoratori
- 2.8. Admin — "batareyalar ichida" kuchi
- 3. Tez ma'lumotnoma
- 4. Batafsil misollar
- Misol 1 — Admin'ga ro'yxatdan o'tkazish
- Misol 2 — ModelAdmin sozlamalari
- Misol 3 — Ro'yxat va tahrirlash sozlamalari
- Misol 4 — Amaliy: to'liq sozlangan admin
- 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.5-dars: Admin panel
21-QISM — DJANGO · 5-dars
1. Kirish va motivatsiya
Django'ning eng mashhur, "batareyalar ichida" ni yorqin ko'rsatuvchi xususiyati — admin panel. Model yozsangiz va uni ro'yxatdan o'tkazsangiz, Django avtomatik to'liq ma'lumot boshqaruvi UI beradi: ro'yxat, qidiruv, filtr, qo'shish/tahrir/o'chirish formalari — bir qator kod bilan. Boshqa freymvorklarda buni haftalab qurasiz.
Admin panel — ma'lumot boshqaruvi uchun tayyor interfeys. Kontent muharrirlari, administratorlar, jamoa a'zolari — kod yozmasdan ma'lumot bilan ishlaydi. Bu 21.1 dagi "batareyalar ichida" falsafasining eng aniq misoli.
Real vaziyat. Bir kompaniya mahsulot katalogini boshqarish uchun maxsus admin panel qurmoqchi edi — dizayner, frontend, backend, haftalab ish. Django dasturchi shunchaki modellarni admin'ga ro'yxatdan o'tkazdi: list_display, search_fields, list_filter — bir soatda to'liq admin panel tayyor bo'ldi (qidiruv, filtr, tahrir bilan). Kontent jamoasi darrov ishni boshladi. Django admin — bepul, kuchli, moslashuvchan.
Bu darsda admin panelni — ro'yxatdan o'tkazish, sozlash va moslashtirishni o'rganamiz.
Bu darsda:
- Model'ni admin'ga ro'yxatdan o'tkazish
-
ModelAdminsozlamalari list_display(ustunlar)list_filtervasearch_fieldsorderingva sahifalash- Maydonlarni tahrirlash sozlamalari
@admin.registerdekoratori- Amaliy: to'liq sozlangan admin
ℹ Misollarda Django standalone — odatda admin
admin.pyda sozlanadi.
2. Nazariya — chuqur tushuntirish
2.1. Admin'ga ro'yxatdan o'tkazish
Modelni admin'ga qo'shish — bir qator:
from django.contrib import admin
from .models import Kurs
admin.site.register(Kurs) admin.site.register(Kurs) — model uchun to'liq admin UI yaratadi: ro'yxat, qo'shish, tahrir, o'chirish. Hech qanday qo'shimcha kod kerak emas. Bu "batareyalar ichida" — model'dan avtomatik interfeys.
2.2. ModelAdmin sozlamalari
Admin ko'rinishini ModelAdmin bilan sozlash:
from django.contrib import admin
@admin.register(Kurs)
class KursAdmin(admin.ModelAdmin):
list_display = ["nom", "narx", "faol"]
list_filter = ["faol"]
search_fields = ["nom"] ModelAdmin — admin xatti-harakatini sozlaydi (qaysi ustun, qidiruv, filtr). @admin.register(Kurs) — modelni shu sozlama bilan ro'yxatdan o'tkazadi. Sozlamasangiz — standart (oddiy ro'yxat).
2.3. list_display (ustunlar)
list_display — ro'yxatda ko'rinadigan ustunlar:
class KursAdmin(admin.ModelAdmin):
list_display = ["nom", "narx", "daraja", "faol"] list_display — ro'yxat jadvalida qaysi maydonlar ko'rinishini belgilaydi. Usiz faqat __str__ ko'rinadi. Metod ham qo'shish mumkin (hisoblangan ustun). Bu ma'lumotni jadval ko'rinishida beradi.
2.4. list_filter va search_fields
Filtr va qidiruv:
class KursAdmin(admin.ModelAdmin):
list_filter = ["faol", "daraja"] # yon filtr
search_fields = ["nom", "tavsif"] # qidiruv qutisi| Sozlama | Vazifa |
|---|---|
list_filter |
Yon panel filtri (holat, sana) |
search_fields |
Qidiruv qutisi (matn) |
list_display_links |
Qaysi ustun havola |
list_filter — yon panelda filtr (masalan, "faol" bo'yicha); search_fields — yuqorida qidiruv qutisi (nom bo'yicha). Bular ma'lumot topishni oson qiladi — kod yozmasdan.
2.5. ordering va sahifalash
Tartib va sahifalash:
class KursAdmin(admin.ModelAdmin):
ordering = ["-narx"] # tartib
list_per_page = 25 # sahifada nechta ordering — admin ro'yxati tartibi (Meta.orderingni bekor qiladi); list_per_page — sahifalash (katta ma'lumot uchun). Django admin sahifalashni avtomatik qiladi.
2.6. Maydonlarni tahrirlash
Tahrir formasini sozlash:
class KursAdmin(admin.ModelAdmin):
fields = ["nom", "narx", "tavsif"] # tartib/tanlov
readonly_fields = ["yaratilgan"] # faqat o'qish
list_editable = ["narx"] # ro'yxatda tahrir fields — tahrir formasida qaysi maydonlar; readonly_fields — o'zgartirib bo'lmaydiganlar (avto sana); list_editable — ro'yxatda to'g'ridan tahrir. Bu tahrir tajribasini moslashtiradi.
2.7. @admin.register dekoratori
Ro'yxatdan o'tkazishning ikki usuli:
# 1. dekorator (zamonaviy):
@admin.register(Kurs)
class KursAdmin(admin.ModelAdmin): ...
# 2. funksiya (eski):
admin.site.register(Kurs, KursAdmin) @admin.register(Kurs) — zamonaviy, toza usul (klass ustida). Eski admin.site.register(Kurs, KursAdmin) ham ishlaydi. Ikkalasi bir xil natija — dekorator afzal.
2.8. Admin — "batareyalar ichida" kuchi
| Admin beradi | Kod yozmasdan |
|---|---|
| Ro'yxat (jadval) | |
| Qo'shish formasi | |
| Tahrir formasi | |
| O'chirish | |
| Qidiruv, filtr | (sozlash) |
| Sahifalash | |
| Autentifikatsiya | (kirish) |
Admin panel — to'liq CRUD UI 20.9-bob bepul: model'dan avtomatik. Bu Django'ning eng katta afzalligi — ma'lumot boshqaruvi uchun haftalab ish o'rniga bir necha qator. Kontent jamoasi darrov ishlaydi.
3. Tez ma'lumotnoma
from django.contrib import admin
from .models import Kurs
@admin.register(Kurs)
class KursAdmin(admin.ModelAdmin):
list_display = ["nom", "narx", "faol"] # ustunlar
list_filter = ["faol", "daraja"] # yon filtr
search_fields = ["nom"] # qidiruv
ordering = ["-narx"] # tartib
list_per_page = 25 # sahifalash
readonly_fields = ["yaratilgan"] # o'qish
list_editable = ["narx"] # ro'yxatda tahrirAdmin sozlamalari
list_display — ro'yxat ustunlari
list_filter — yon filtr
search_fields — qidiruv qutisi
ordering — tartib4. Batafsil misollar
Misollarda Django standalone — odatda admin
admin.pyda sozlanadi.
Misol 1 — Admin'ga ro'yxatdan o'tkazish
"""model'ni admin'ga ro'yxatdan o'tkazish; @admin.register dekoratori; admin registri; to'liq CRUD UI."""
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=["django.contrib.contenttypes", "django.contrib.auth", "django.contrib.admin", "wisar"],
DEFAULT_AUTO_FIELD="django.db.models.BigAutoField",
)
_app = types.ModuleType("wisar")
_app.__path__ = [tempfile.gettempdir()]
sys.modules["wisar"] = _app
django.setup()
from django.contrib import admin
from django.db import models
class Kurs(models.Model):
nom = models.CharField(max_length=100)
narx = models.IntegerField()
class Meta:
app_label = "wisar"
def __str__(self):
return self.nom
class Izoh(models.Model):
matn = models.CharField(max_length=200)
class Meta:
app_label = "wisar"
admin.site.register(Kurs) # oddiy ro'yxatdan o'tkazish
admin.site.register(Izoh)
def main() -> None:
print("=== 1. Ro'yxatdan o'tkazilgan modellar ===")
modellar = [m.__name__ for m in admin.site._registry]
print(f" admin'da: {sorted(modellar)}")
print("\n=== 2. Kurs admin'da ===")
print(f" Kurs ro'yxatdan o'tgan: {Kurs in admin.site._registry}")
print("\n=== 3. Standart ModelAdmin ===")
ma = admin.site._registry[Kurs]
print(f" ModelAdmin: {type(ma).__name__}")
print("\n=== 4. Admin — to'liq CRUD UI ===")
print(" ro'yxat + qo'shish + tahrir + o'chirish (kod yozmasdan)")
print(" ⭐ admin.site.register — model'dan avtomatik boshqaruv UI")
if __name__ == "__main__":
main()Natijaning muhim qismi:
=== 1. Ro'yxatdan o'tkazilgan modellar ===
admin'da: ['Group', 'Izoh', 'Kurs', 'User']
=== 2. Kurs admin'da ===
Kurs ro'yxatdan o'tgan: True
=== 3. Standart ModelAdmin ===
ModelAdmin: ModelAdmin
=== 4. Admin — to'liq CRUD UI ===
ro'yxat + qo'shish + tahrir + o'chirish (kod yozmasdan)
⭐ admin.site.register — model'dan avtomatik boshqaruv UINima ko'rsatdi: 2.1, 2.7, 2.8-bo'limlar.
Misol 2 — ModelAdmin sozlamalari
"""ModelAdmin bilan sozlash; list_display (ustunlar); list_filter va search_fields; @admin.register."""
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=["django.contrib.contenttypes", "django.contrib.auth", "django.contrib.admin", "wisar"],
DEFAULT_AUTO_FIELD="django.db.models.BigAutoField",
)
_app = types.ModuleType("wisar")
_app.__path__ = [tempfile.gettempdir()]
sys.modules["wisar"] = _app
django.setup()
from django.contrib import admin
from django.db import models
class Kurs(models.Model):
nom = models.CharField(max_length=100)
narx = models.IntegerField()
daraja = models.CharField(max_length=20)
faol = models.BooleanField(default=True)
class Meta:
app_label = "wisar"
def __str__(self):
return self.nom
@admin.register(Kurs)
class KursAdmin(admin.ModelAdmin):
list_display = ["nom", "narx", "daraja", "faol"]
list_filter = ["faol", "daraja"]
search_fields = ["nom"]
ordering = ["-narx"]
def main() -> None:
ma = admin.site._registry[Kurs]
print("=== 1. list_display (ro'yxat ustunlari) ===")
print(f" ustunlar: {list(ma.list_display)}")
print("\n=== 2. list_filter (yon filtr) ===")
print(f" filtrlar: {list(ma.list_filter)}")
print("\n=== 3. search_fields (qidiruv) ===")
print(f" qidiruv maydonlari: {list(ma.search_fields)}")
print("\n=== 4. ordering (tartib) ===")
print(f" tartib: {list(ma.ordering)}")
print(" ⭐ ModelAdmin — list_display, list_filter, search_fields (sozlash)")
if __name__ == "__main__":
main()Natijaning muhim qismi:
=== 1. list_display (ro'yxat ustunlari) ===
ustunlar: ['nom', 'narx', 'daraja', 'faol']
=== 2. list_filter (yon filtr) ===
filtrlar: ['faol', 'daraja']
=== 3. search_fields (qidiruv) ===
qidiruv maydonlari: ['nom']
=== 4. ordering (tartib) ===
tartib: ['-narx']
⭐ ModelAdmin — list_display, list_filter, search_fields (sozlash)Nima ko'rsatdi: 2.2, 2.3, 2.4, 2.5-bo'limlar.
Misol 3 — Ro'yxat va tahrirlash sozlamalari
"""ro'yxat sozlamalari (list_per_page, list_editable); tahrir formasi (fields, readonly_fields); hisoblangan ustun."""
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=["django.contrib.contenttypes", "django.contrib.auth", "django.contrib.admin", "wisar"],
USE_TZ=True,
DEFAULT_AUTO_FIELD="django.db.models.BigAutoField",
)
_app = types.ModuleType("wisar")
_app.__path__ = [tempfile.gettempdir()]
sys.modules["wisar"] = _app
django.setup()
from django.contrib import admin
from django.db import models
class Kurs(models.Model):
nom = models.CharField(max_length=100)
narx = models.IntegerField()
tavsif = models.TextField(blank=True, default="")
yaratilgan = models.DateTimeField(auto_now_add=True)
class Meta:
app_label = "wisar"
def __str__(self):
return self.nom
@admin.display(description="Qimmat kurs")
def qimmatmi(self):
return self.narx > 100
@admin.register(Kurs)
class KursAdmin(admin.ModelAdmin):
list_display = ["nom", "narx", "qimmatmi"] # metod ham ustun
list_editable = ["narx"] # ro'yxatda tahrir
list_per_page = 25 # sahifalash
fields = ["nom", "narx", "tavsif"] # tahrir formasi
readonly_fields = ["yaratilgan"] # faqat o'qish
def main() -> None:
ma = admin.site._registry[Kurs]
print("=== 1. list_display (metod bilan) ===")
print(f" ustunlar: {list(ma.list_display)} (qimmatmi — metod)")
print("\n=== 2. list_editable (ro'yxatda tahrir) ===")
print(f" tahrir mumkin: {list(ma.list_editable)}")
print("\n=== 3. Sahifalash ===")
print(f" list_per_page: {ma.list_per_page}")
print("\n=== 4. Tahrir formasi sozlamalari ===")
print(f" fields: {list(ma.fields)}")
print(f" readonly_fields: {list(ma.readonly_fields)}")
print(" ⭐ list_editable, readonly_fields, hisoblangan ustun (metod)")
if __name__ == "__main__":
main()Natijaning muhim qismi:
=== 1. list_display (metod bilan) ===
ustunlar: ['nom', 'narx', 'qimmatmi'] (qimmatmi — metod)
=== 2. list_editable (ro'yxatda tahrir) ===
tahrir mumkin: ['narx']
=== 3. Sahifalash ===
list_per_page: 25
=== 4. Tahrir formasi sozlamalari ===
fields: ['nom', 'narx', 'tavsif']
readonly_fields: ['yaratilgan']
⭐ list_editable, readonly_fields, hisoblangan ustun (metod)Nima ko'rsatdi: 2.5, 2.6-bo'limlar.
Misol 4 — Amaliy: to'liq sozlangan admin
Real ilovadagi to'liq admin sozlamasini quramiz: ro'yxat ustunlari, filtr, qidiruv, tahrir sozlamalari va admin bilan ma'lumot ko'rsatish. Bu — professional Django admin panelining namunasi.
"""to'liq admin: list_display, list_filter, search_fields, ordering, fieldsets; ma'lumot bilan; batareyalar ichida."""
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=["django.contrib.contenttypes", "django.contrib.auth", "django.contrib.admin", "wisar"],
USE_TZ=True,
DEFAULT_AUTO_FIELD="django.db.models.BigAutoField",
)
_app = types.ModuleType("wisar")
_app.__path__ = [tempfile.gettempdir()]
sys.modules["wisar"] = _app
django.setup()
from django.contrib import admin
from django.db import connection, models
class Kurs(models.Model):
nom = models.CharField(max_length=100)
narx = models.IntegerField()
daraja = models.CharField(max_length=20, default="boshlangich")
faol = models.BooleanField(default=True)
class Meta:
app_label = "wisar"
def __str__(self):
return self.nom
@admin.register(Kurs)
class KursAdmin(admin.ModelAdmin):
list_display = ["nom", "narx", "daraja", "faol"]
list_filter = ["faol", "daraja"]
search_fields = ["nom"]
ordering = ["nom"]
list_per_page = 20
fieldsets = [
("Asosiy", {"fields": ["nom", "narx"]}),
("Qo'shimcha", {"fields": ["daraja", "faol"]}),
]
def main() -> None:
with connection.schema_editor() as se:
se.create_model(Kurs)
Kurs.objects.create(nom="Python", narx=100, daraja="boshlangich")
Kurs.objects.create(nom="Go", narx=120, daraja="orta", faol=False)
Kurs.objects.create(nom="Rust", narx=150, daraja="yuqori")
ma = admin.site._registry[Kurs]
print("=== 1. Admin sozlamalari ===")
print(f" ustunlar: {list(ma.list_display)}")
print(f" filtr: {list(ma.list_filter)}, qidiruv: {list(ma.search_fields)}")
print("\n=== 2. Fieldsets (guruhlangan forma) ===")
for nom, sozlama in ma.fieldsets:
print(f" '{nom}': {sozlama['fields']}")
print("\n=== 3. Admin ma'lumotni ko'rsatadi ===")
qs = ma.get_queryset(None) if hasattr(ma, "get_queryset") else Kurs.objects.all()
print(f" jami kurslar: {Kurs.objects.count()}")
print(f" faol: {[k.nom for k in Kurs.objects.filter(faol=True)]}")
print("\n=== 4. Batareyalar ichida ===")
print(f" {Kurs.objects.count()} kurs uchun to'liq admin UI — kod yozmasdan")
print(" ⭐ to'liq admin — ro'yxat, filtr, qidiruv, guruhlangan forma")
if __name__ == "__main__":
main()Natijaning muhim qismi:
=== 1. Admin sozlamalari ===
ustunlar: ['nom', 'narx', 'daraja', 'faol']
filtr: ['faol', 'daraja'], qidiruv: ['nom']
=== 2. Fieldsets (guruhlangan forma) ===
'Asosiy': ['nom', 'narx']
'Qo'shimcha': ['daraja', 'faol']
=== 3. Admin ma'lumotni ko'rsatadi ===
jami kurslar: 3
faol: ['Python', 'Rust']
=== 4. Batareyalar ichida ===
3 kurs uchun to'liq admin UI — kod yozmasdan
⭐ to'liq admin — ro'yxat, filtr, qidiruv, guruhlangan formaNima ko'rsatdi: 2.1–2.8-bo'limlar.
5. To'g'ri va noto'g'ri tushunishlar
| Noto'g'ri fikr | To'g'risi |
|---|---|
| "Admin panelni qurish kerak" | Django avtomatik beradi |
| "Ro'yxatdan o'tkazish murakkab" | Bir qator |
"list_displaysiz to'liq ro'yxat" |
Faqat __str__ |
| "Filtr/qidiruv qo'lda" | list_filter/search_fields |
| "Admin — oddiy foydalanuvchiga" | Faqat xodimlar (staff) |
| "Metod ustun bo'lmaydi" | list_displayda mumkin |
| "Admin moslashtirib bo'lmaydi" | Juda moslashuvchan |
| "Sahifalash qo'lda" | Avtomatik |
6. Keng tarqalgan xatolar va yechimlari
1. Modelni ro'yxatdan o'tkazmaslik
# admin.py bo'sh # ⚠️ admin'da ko'rinmaydi
admin.site.register(Kurs) # ✅2. list_displayda mavjud bo'lmagan maydon
list_display = ["yoq_maydon"] # ❌ xato
list_display = ["nom", "narx"] # ✅ mavjud3. list_editableda list_displaysiz maydon
list_editable = ["narx"] # ⚠️ list_display'da bo'lsin
list_display = ["nom", "narx"]; list_editable = ["narx"] # ✅4. search_fieldssiz katta ro'yxat
class KursAdmin(admin.ModelAdmin): ... # ⚠️ qidiruvsiz qiyin
search_fields = ["nom"] # ✅5. Metodni list_displayda tavsifsiz
def qimmatmi(self): return self.narx > 100 # ustun nomi "qimmatmi"
@admin.display(description="Qimmat") # ✅ o'qiladigan nom
def qimmatmi(self): ...6. Admin'ga kirish uchun superuser yo'q
# admin'ga kirish uchun superuser kerak
python manage.py createsuperuser # ✅7. readonly_fieldsni tahrir qilishga urinish
fields = ["yaratilgan"] # ⚠️ avto maydon tahrir
readonly_fields = ["yaratilgan"] # ✅7. Integratsiya — bu bilim qayerda kerak bo'ladi
- 21.3-dars (o'tilgan): model — admin manbai
- 21.4-dars (o'tilgan): migratsiya — admin'dan oldin
- 21.11-dars: auth — admin kirishi (staff, superuser)
- 20.9-dars (o'tilgan): CRUD — admin avtomatik CRUD
- 21.8-dars: forma — admin formalari
8. Eng yaxshi amaliyotlar
Modellarni admin'ga ro'yxatdan o'tkazing.
list_displaybilan foydali ustunlarni ko'rsating.search_fieldsvalist_filterbilan topishni osonlashtiring.@admin.registerdekoratorini ishlating (zamonaviy).readonly_fieldsbilan avto maydonlarni himoya qiling.fieldsetsbilan tahrir formasini guruhlang.list_per_pagebilan katta ro'yxatni sahifalang.Metodlarda
@admin.display(description=...)bering.
9. Amaliy topshiriq
Vazifa 1: Bashorat qiling
1. # admin'ga ro'yxatdan o'tkazish qanday?
2. # ModelAdmin nima uchun?
3. # list_display nima?
4. # list_filter nima?
5. # search_fields nima?
6. # @admin.register nima?
7. # list_display'siz nima ko'rinadi?
8. # metod ustun bo'ladimi?
9. # readonly_fields nima?
10. # admin'ga kim kiradi?
11. # fieldsets nima?
12. # sahifalash qanday?Javoblar
admin.site.register(Model)yoki@admin.register- Admin ko'rinishini sozlash
- Ro'yxat jadvalidagi ustunlar
- Yon panel filtri
- Qidiruv qutisi maydonlari
- Ro'yxatdan o'tkazish dekoratori (zamonaviy)
- Faqat
__str__ - Ha (
list_displayda, hisoblangan) - Faqat o'qiladigan maydonlar (avto sana)
- Xodimlar (staff/superuser)
- Tahrir formasini guruhlash
- Avtomatik (
list_per_page)
Vazifa 2: Xatolarni tuzating
1. # admin.py bo'sh # ro'yxatdan o'tkazish
2. list_display = ["yoq_maydon"] # mavjud emas
3. list_editable = ["narx"] # list_display'siz
4. def qimmatmi(self): ... # tavsifsiz metod
5. fields = ["yaratilgan"] # avto maydonJavoblar
1. admin.site.register(Kurs)
2. list_display = ["nom", "narx"]
3. list_display = ["nom", "narx"]
list_editable = ["narx"]
4. @admin.display(description="Qimmat")
def qimmatmi(self): ...
5. readonly_fields = ["yaratilgan"]Vazifa 3: Mahsulot admin
Mahsulot uchun admin:
- Model (nom, narx, zaxira, faol)
list_display,list_filter,search_fieldsordering,list_per_page- Standalone tekshirish
Vazifa 4: Hisoblangan ustunlar
Metod ustunlari:
zaxira_holati(),chegirmali_narx()metodlari@admin.displaybilan tavsiflist_displayda ko'rsatish- Natijani tekshirish
Vazifa 5: Guruhlangan forma
fieldsets bilan:
- Model (ko'p maydon)
fieldsets— 3 guruhreadonly_fields- Sozlamani tekshirish
Vazifa 6: To'liq admin panel
Blog admin:
Maqola,Izohmodellari- Har biri uchun to'liq
ModelAdmin - Filtr, qidiruv, tartib
- Ma'lumot bilan test
Vazifa 7: O'ylash
Django admin — model'dan avtomatik to'liq CRUD UI yaratadi: bir model e'lon qilinsa, ro'yxat, qidiruv, filtr, tahrir formalari bepul keladi. Bu 21.3 dagi "model — yagona manba" tamoyilining yana bir natijasi (jadval, ORM, forma, admin — bir model'dan). "Bir e'londan ko'p natija" (deklarativ, generatsiya) yondashuvining afzalligi nima, va bu Django admin, FastAPI hujjati 20.16-bob kabi joylarda qanday qayta-qayta uchraydi?
Javob
Qisqa javob: Django admin model'dan avtomatik UI generatsiya qiladi — siz "nima" (model) ni e'lon qilasiz, Django "qanday" (admin UI) ni yaratadi. Bu "bir e'londan ko'p natija": bir model'dan jadval, ORM, forma, admin, serializer kelib chiqadi. Afzalligi: kam kod (bir e'lon), izchillik (hammasi bir manbadan), tez (generatsiya avtomatik), saqlash oson (model o'zgarsa, hammasi yangilanadi). Bu deklarativ yondashuv FastAPI hujjati (20.16 — kod'dan OpenAPI), Pydantic (20.5 — model'dan validatsiya+hujjat) kabi joylarda qayta-qayta uchraydi — "e'lon qil, tizim yaratsin".
1. Bir e'londan ko'p natija
| Bir e'lon | Ko'p natija |
|---|---|
| Django model | Jadval + ORM + admin + forma |
| Pydantic model | Validatsiya + hujjat + sxema |
| FastAPI endpoint | Hujjat + validatsiya + marshrut |
2. Afzalliklar
| Afzallik | Sabab |
|---|---|
| Kam kod | Bir e'lon |
| Izchillik | Bir manbadan |
| Tez | Avtomatik generatsiya |
| Saqlash | O'zgarish bir joyda |
3. Deklarativ generatsiya
"Nima" ni e'lon qil (model, sxema), "qanday" ni tizim yaratsin (admin, hujjat). Bu imperativ (qo'lda qurish) dan farq qiladi — kam ish, ko'p natija.
4. "E'lon qil, tizim yaratsin" boshqa joyda
| Soha | E'lon → Natija |
|---|---|
| Django admin | Model → UI |
| FastAPI | Kod → OpenAPI (20.16) |
| Pydantic | Model → validatsiya (20.5) |
| ORM | Model → SQL |
| Migratsiya | Model → sxema |
5. Muhandislik saboqlari
- Bir manba e'lon qil, ko'p natija olib
- Deklarativ — kam kod, izchil
- Generatsiya — tizim "qanday" ni hal qiladi
- "Yagona manba" — Django/FastAPI markaziy tamoyili
6. Xulosa
- Admin — model'dan avtomatik UI (generatsiya)
- Bir e'lon → ko'p natija (kam kod, izchil)
- Deklarativ — "nima" e'lon, "qanday" tizim
- Tamoyil qayta-qayta (admin, hujjat, ORM)
Nimani mustahkamlaydi: 2.1–2.8-bo'limlar.
Xulosa
Bu darsda Django admin panelini o'rgandik.
Eng muhim uch fikr:
Admin — avtomatik CRUD UI. Modelni admin'ga
admin.site.register(Kurs)(yoki@admin.register(Kurs)dekoratori) bilan ro'yxatdan o'tkazsangiz, Django to'liq ma'lumot boshqaruvi UI beradi: ro'yxat, qo'shish, tahrir, o'chirish formalari — kod yozmasdan. Bu 21.1 dagi "batareyalar ichida" falsafasining eng yorqin misoli: haftalab ish o'rniga bir necha qator.ModelAdminsozlamalari. Admin ko'rinishiniModelAdminbilan sozlaysiz:list_display(ro'yxat ustunlari, metod ham),list_filter(yon panel filtri),search_fields(qidiruv qutisi),ordering(tartib),list_per_page(sahifalash). Tahrir formasi:fields/fieldsets(maydonlar/guruhlar),readonly_fields(avto maydonlarni himoya),list_editable(ro'yxatda to'g'ridan tahrir). Bular ma'lumot topish va boshqarishni oson qiladi."Bir e'londan ko'p natija". Django admin — "model — yagona manba" tamoyilining natijasi: bir model'dan jadval, ORM, forma, admin kelib chiqadi. Bu deklarativ generatsiya — siz "nima" (model) ni e'lon qilasiz, Django "qanday" (UI) ni yaratadi. Bu yondashuv kam kod, izchillik va tezlik beradi, va FastAPI hujjati 20.16-bob, Pydantic 20.5-bob kabi joylarda qayta-qayta uchraydi.
Keyingi darsda view va URL ni chuqurroq o'rganamiz: funksiyali va klassli view'lar, URL naqshlari, parametrlar va so'rov-javob boshqaruvi.
Izohlar (0)
Izoh yozish uchun kiring.
- Hozircha izoh yo'q. Birinchi bo'ling!