IlmHamroh
Python kursi/Django5/16-dars15 daqiqa
Mundarija (22)

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
  • ModelAdmin sozlamalari
  • list_display (ustunlar)
  • list_filter va search_fields
  • ordering va sahifalash
  • Maydonlarni tahrirlash sozlamalari
  • @admin.register dekoratori
  • 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:

python
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:

python
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:

python
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:

python
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:

python
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:

python
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:

python
# 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

python
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 tahrir

Admin sozlamalari

list_display  — ro'yxat ustunlari
list_filter   — yon filtr
search_fields — qidiruv qutisi
ordering      — tartib

4. Batafsil misollar

Misollarda Django standalone — odatda admin admin.pyda sozlanadi.

Misol 1 — Admin'ga ro'yxatdan o'tkazish

python
"""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:

text
=== 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 UI

Nima ko'rsatdi: 2.1, 2.7, 2.8-bo'limlar.

Misol 2 — ModelAdmin sozlamalari

python
"""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:

text
=== 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

python
"""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:

text
=== 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.

python
"""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:

text
=== 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 forma

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
"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

python
# admin.py bo'sh                             # ⚠️ admin'da ko'rinmaydi
admin.site.register(Kurs)                     # ✅

2. list_displayda mavjud bo'lmagan maydon

python
list_display = ["yoq_maydon"]                # ❌ xato
list_display = ["nom", "narx"]               # ✅ mavjud

3. list_editableda list_displaysiz maydon

python
list_editable = ["narx"]                     # ⚠️ list_display'da bo'lsin
list_display = ["nom", "narx"]; list_editable = ["narx"]   # ✅

4. search_fieldssiz katta ro'yxat

python
class KursAdmin(admin.ModelAdmin): ...       # ⚠️ qidiruvsiz qiyin
search_fields = ["nom"]                       # ✅

5. Metodni list_displayda tavsifsiz

python
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

bash
# admin'ga kirish uchun superuser kerak
python manage.py createsuperuser              # ✅

7. readonly_fieldsni tahrir qilishga urinish

python
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

  1. Modellarni admin'ga ro'yxatdan o'tkazing.

  2. list_display bilan foydali ustunlarni ko'rsating.

  3. search_fields va list_filter bilan topishni osonlashtiring.

  4. @admin.register dekoratorini ishlating (zamonaviy).

  5. readonly_fields bilan avto maydonlarni himoya qiling.

  6. fieldsets bilan tahrir formasini guruhlang.

  7. list_per_page bilan katta ro'yxatni sahifalang.

  8. Metodlarda @admin.display(description=...) bering.


9. Amaliy topshiriq

Vazifa 1: Bashorat qiling

python
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
  1. admin.site.register(Model) yoki @admin.register
  2. Admin ko'rinishini sozlash
  3. Ro'yxat jadvalidagi ustunlar
  4. Yon panel filtri
  5. Qidiruv qutisi maydonlari
  6. Ro'yxatdan o'tkazish dekoratori (zamonaviy)
  7. Faqat __str__
  8. Ha (list_displayda, hisoblangan)
  9. Faqat o'qiladigan maydonlar (avto sana)
  10. Xodimlar (staff/superuser)
  11. Tahrir formasini guruhlash
  12. Avtomatik (list_per_page)

Vazifa 2: Xatolarni tuzating

python
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 maydon
Javoblar
python
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:

  1. Model (nom, narx, zaxira, faol)
  2. list_display, list_filter, search_fields
  3. ordering, list_per_page
  4. Standalone tekshirish

Vazifa 4: Hisoblangan ustunlar

Metod ustunlari:

  1. zaxira_holati(), chegirmali_narx() metodlari
  2. @admin.display bilan tavsif
  3. list_displayda ko'rsatish
  4. Natijani tekshirish

Vazifa 5: Guruhlangan forma

fieldsets bilan:

  1. Model (ko'p maydon)
  2. fieldsets — 3 guruh
  3. readonly_fields
  4. Sozlamani tekshirish

Vazifa 6: To'liq admin panel

Blog admin:

  1. Maqola, Izoh modellari
  2. Har biri uchun to'liq ModelAdmin
  3. Filtr, qidiruv, tartib
  4. 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

  1. Bir manba e'lon qil, ko'p natija olib
  2. Deklarativ — kam kod, izchil
  3. Generatsiya — tizim "qanday" ni hal qiladi
  4. "Yagona manba" — Django/FastAPI markaziy tamoyili

6. Xulosa

  1. Admin — model'dan avtomatik UI (generatsiya)
  2. Bir e'lon → ko'p natija (kam kod, izchil)
  3. Deklarativ — "nima" e'lon, "qanday" tizim
  4. 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:

  1. 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.

  2. ModelAdmin sozlamalari. Admin ko'rinishini ModelAdmin bilan 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.

  3. "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.

Ulashish:Telegram'da

Izohlar (0)

Izoh yozish uchun kiring.

  • Hozircha izoh yo'q. Birinchi bo'ling!
21.5-dars: Admin panel — IlmHamroh