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

21.8-dars: Forma

21-QISM — DJANGO · 8-dars


1. Kirish va motivatsiya

Foydalanuvchi ma'lumot kiritadi: ro'yxatdan o'tish, izoh yozish, kurs qo'shish. Bu ma'lumot xavfsiz qabul qilinishi, tekshirilishi (validatsiya) va saqlanishi kerak. Buni qo'lda qilish (request.POST["nom"], har maydonni tekshirish) — xato manbai. Yechim — Django formasi.

Django forma — foydalanuvchi ma'lumotini qabul qilish, validatsiya va HTML forma yaratishni birlashtiradi. Siz forma sinfini (maydonlar, cheklovlar) e'lon qilasiz, Django validatsiyani, xato xabarlarini va HTML'ni avtomatik qiladi. ModelForm esa forma'ni to'g'ridan model'dan yaratadi — yana ham kam kod.

Real vaziyat. Bir jamoa forma ma'lumotini qo'lda oldi: nom = request.POST.get("nom"), keyin if not nom, if len(nom) < 2, try: narx = int(...) — o'nlab tekshiruv, ba'zilari unutilgan. Xato ma'lumot bazaga tushdi. Jamoa Django forma'siga o'tdi: KursForma sinfi, form.is_valid() — barcha validatsiya bir joyda, xato xabarlari avtomatik. Kod uch barobar qisqardi, xatolar yo'qoldi. Django forma — 20.5 dagi Pydantic'ning Django versiyasi.

Bu darsda forma'ni — maydonlar, validatsiya, ModelForm va ishlatishni o'rganamiz.

Bu darsda:

  • Forma sinfi (forms.Form)
  • Forma maydonlari va validatsiya
  • is_valid() va cleaned_data
  • Xato xabarlari (o'zbekcha)
  • Maxsus validatsiya (clean_<maydon>)
  • ModelForm (model'dan forma)
  • Forma'ni ko'rsatish va saqlash
  • Amaliy: to'liq forma jarayoni

ℹ Misollarda Django forms bilan sinaladi.


2. Nazariya — chuqur tushuntirish

2.1. Forma sinfi

Forma — forms.Formdan meros olgan sinf (maydonlar bilan):

python
from django import forms

class KursForma(forms.Form):
    nom = forms.CharField(max_length=100)
    narx = forms.IntegerField(min_value=0)
    email = forms.EmailField(required=False)
Element Ma'no
forms.Form Asosiy forma klassi
forms.CharField Matn maydoni
required=False Ixtiyoriy maydon

Forma — foydalanuvchi kiritadigan ma'lumot sxemasi (maydonlar, cheklovlar). Bu 20.5 dagi Pydantic modeliga o'xshaydi. Forma maydonlari model maydonlaridan farq qiladi (forms.CharField, models.CharField emas).

2.2. Forma maydonlari va validatsiya

Forma maydonlari validatsiya bilan:

Maydon Ma'lumot Cheklov
CharField Matn max_length, min_length
IntegerField Son min_value, max_value
EmailField Email Format tekshiruvi
BooleanField True/False —
ChoiceField Tanlov choices
DateField Sana Format
python
nom = forms.CharField(min_length=2, max_length=100)
narx = forms.IntegerField(min_value=0, max_value=10000)

Har maydon o'z validatsiyasiga ega: CharField uzunlik, IntegerField oralik, EmailField format. Bu 20.4 dagi FastAPI validatsiyasiga o'xshaydi — deklarativ (nima kerak, e'lon qilasiz).

2.3. is_valid() va cleaned_data

Forma ma'lumot bilan tekshiriladi:

python
forma = KursForma({"nom": "python", "narx": "100"})

if forma.is_valid():
    forma.cleaned_data       # {"nom": "python", "narx": 100} (tozalangan)
else:
    forma.errors             # xatolar

is_valid() — ma'lumotni tekshiradi (True/False). To'g'ri bo'lsa cleaned_data — tozalangan, aylantirilgan ma'lumot ("100" → 100). Xato bo'lsa errors — maydon bo'yicha xatolar. Bu 20.5 dagi Pydantic validatsiyasiga o'xshaydi.

2.4. Xato xabarlari

Xato xabarlarini moslashtirish (o'zbekcha):

python
class KursForma(forms.Form):
    nom = forms.CharField(
        min_length=2,
        error_messages={
            "required": "Nom majburiy",
            "min_length": "Nom kamida 2 belgi bo'lsin",
        },
    )

error_messages — xato xabarini moslashtiradi (til, aniqlik). Standart xabarlar inglizcha — o'zbekcha uchun error_messages. Xato form.errors[maydon]da (ro'yxat) bo'ladi.

2.5. Maxsus validatsiya

Murakkab qoida uchun clean_<maydon> metodi:

python
class KursForma(forms.Form):
    nom = forms.CharField()

    def clean_nom(self):
        nom = self.cleaned_data["nom"]
        if nom.lower() == "admin":
            raise forms.ValidationError("'admin' nomi taqiqlangan")
        return nom.strip().title()      # tozalangan qiymatni qaytaring

clean_<maydon> — maydon uchun maxsus validatsiya/tozalash. raise forms.ValidationError — xato; return — tozalangan qiymat. Bu 20.5 dagi field_validatorga o'xshaydi. Butun forma uchun clean() metodi (bir necha maydon aloqasi).

2.6. ModelForm

ModelForm — forma'ni model'dan avtomatik yaratadi:

python
from django import forms

class KursForma(forms.ModelForm):
    class Meta:
        model = Kurs
        fields = ["nom", "narx"]        # yoki "__all__"

ModelForm — model maydonlaridan forma yaratadi (takror yo'q). Meta.model va fields — qaysi model, qaysi maydonlar. form.save() — to'g'ridan bazaga saqlaydi. Bu "yagona manba" 21.3-bob — model'dan forma.

2.7. Forma'ni ko'rsatish va saqlash

Forma'ni template'da ko'rsatish va saqlash:

python
# view'da:
def kurs_qosh(request):
    if request.method == "POST":
        forma = KursForma(request.POST)
        if forma.is_valid():
            forma.save()            # ModelForm — bazaga
            return redirect("...")
    else:
        forma = KursForma()         # bo'sh forma
    return render(request, "forma.html", {"forma": forma})
html
<!-- template'da: -->
<form method="post">{% csrf_token %}{{ forma.as_p }}<button>Saqlash</button></form>

View forma'ni boshqaradi: GET — bo'sh forma, POST — tekshiruv va saqlash. Template {{ forma.as_p }} bilan HTML'ni avtomatik chiqaradi. {% csrf_token %} — CSRF himoya (majburiy).

2.8. Forma va CSRF himoya

Django forma'lari CSRF himoyasiga ega:

{% csrf_token %} — CSRF (cross-site request forgery) hujumidan himoya: har POST forma'da majburiy. Django avtomatik token yaratadi va tekshiradi. Bu "xavfsiz standart" 21.7-bob — himoya yoqilgan. Forma — ma'lumot qabul qilishning xavfsiz usuli.


3. Tez ma'lumotnoma

python
from django import forms

# oddiy forma:
class KursForma(forms.Form):
    nom = forms.CharField(min_length=2, max_length=100)
    narx = forms.IntegerField(min_value=0)

    def clean_nom(self):                    # maxsus validatsiya
        return self.cleaned_data["nom"].strip()

# model forma:
class KursForma(forms.ModelForm):
    class Meta:
        model = Kurs
        fields = ["nom", "narx"]

# ishlatish:
forma = KursForma(request.POST)
if forma.is_valid():
    forma.cleaned_data      # tozalangan
    forma.save()            # ModelForm — bazaga
else:
    forma.errors            # xatolar

Forma oqimi

POST → Forma(data) → is_valid() → cleaned_data/save() yoki errors
template: {% csrf_token %} {{ forma.as_p }}

4. Batafsil misollar

Misollarda Django forms bilan sinaladi.

Misol 1 — Forma va validatsiya

python
"""forma sinfi (forms.Form); maydonlar va validatsiya; is_valid(); cleaned_data (tozalangan, aylantirilgan)."""

import warnings
warnings.filterwarnings("ignore")

import django
from django.conf import settings

settings.configure(DEBUG=False, USE_I18N=False)
django.setup()

from django import forms


class KursForma(forms.Form):
    nom = forms.CharField(min_length=2, max_length=100)
    narx = forms.IntegerField(min_value=0)
    email = forms.EmailField(required=False)


def main() -> None:
    print("=== 1. To'g'ri ma'lumot ===")
    forma = KursForma({"nom": "Python", "narx": "100"})
    print(f"  is_valid: {forma.is_valid()}")

    print("\n=== 2. cleaned_data (tozalangan) ===")
    print(f"  cleaned_data: {forma.cleaned_data}")
    print(f"  narx turi: {type(forma.cleaned_data['narx']).__name__} (satr → int)")

    print("\n=== 3. Ixtiyoriy maydon (email) ===")
    print(f"  email (berilmagan): {forma.cleaned_data['email']!r}")

    print("\n=== 4. To'liq ma'lumot ===")
    forma2 = KursForma({"nom": "Go", "narx": "120", "email": "info@wisar.uz"})
    forma2.is_valid()
    print(f"  cleaned_data: {forma2.cleaned_data}")
    print("  ⭐ forma — ma'lumot sxemasi; is_valid tekshiradi; cleaned_data tozalaydi")


if __name__ == "__main__":
    main()

Natijaning muhim qismi:

text
=== 1. To'g'ri ma'lumot ===
  is_valid: True

=== 2. cleaned_data (tozalangan) ===
  cleaned_data: {'nom': 'Python', 'narx': 100, 'email': ''}
  narx turi: int (satr → int)

=== 3. Ixtiyoriy maydon (email) ===
  email (berilmagan): ''

=== 4. To'liq ma'lumot ===
  cleaned_data: {'nom': 'Go', 'narx': 120, 'email': 'info@wisar.uz'}
  ⭐ forma — ma'lumot sxemasi; is_valid tekshiradi; cleaned_data tozalaydi

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

Misol 2 — Xato xabarlari (o'zbekcha)

python
"""validatsiya xatolari; o'zbekcha xato xabarlari (error_messages); errors (maydon bo'yicha); turli xato."""

import warnings
warnings.filterwarnings("ignore")

import django
from django.conf import settings

settings.configure(DEBUG=False, USE_I18N=False)
django.setup()

from django import forms


class KursForma(forms.Form):
    nom = forms.CharField(
        min_length=2,
        error_messages={
            "required": "Nom majburiy",
            "min_length": "Nom kamida 2 belgi bo'lsin",
        },
    )
    narx = forms.IntegerField(
        min_value=0,
        error_messages={
            "required": "Narx majburiy",
            "min_value": "Narx manfiy bo'lmasin",
            "invalid": "Narx son bo'lsin",
        },
    )


def main() -> None:
    print("=== 1. Majburiy maydon yo'q ===")
    forma = KursForma({})
    forma.is_valid()
    print(f"  nom xatosi: {list(forma.errors['nom'])}")
    print(f"  narx xatosi: {list(forma.errors['narx'])}")

    print("\n=== 2. Juda qisqa nom ===")
    forma = KursForma({"nom": "x", "narx": "100"})
    forma.is_valid()
    print(f"  nom: {list(forma.errors['nom'])}")

    print("\n=== 3. Manfiy narx ===")
    forma = KursForma({"nom": "Python", "narx": "-5"})
    forma.is_valid()
    print(f"  narx: {list(forma.errors['narx'])}")

    print("\n=== 4. Son emas ===")
    forma = KursForma({"nom": "Python", "narx": "abc"})
    forma.is_valid()
    print(f"  narx: {list(forma.errors['narx'])}")
    print("  ⭐ error_messages — o'zbekcha xato; errors — maydon bo'yicha")


if __name__ == "__main__":
    main()

Natijaning muhim qismi:

text
=== 1. Majburiy maydon yo'q ===
  nom xatosi: ['Nom majburiy']
  narx xatosi: ['Narx majburiy']

=== 2. Juda qisqa nom ===
  nom: ["Nom kamida 2 belgi bo'lsin"]

=== 3. Manfiy narx ===
  narx: ["Narx manfiy bo'lmasin"]

=== 4. Son emas ===
  narx: ["Narx son bo'lsin"]
  ⭐ error_messages — o'zbekcha xato; errors — maydon bo'yicha

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

Misol 3 — Maxsus validatsiya (clean_<maydon>)

python
"""clean_<maydon> maxsus validatsiya; qiymatni tozalash va tekshirish; ValidationError; clean() (butun forma)."""

import warnings
warnings.filterwarnings("ignore")

import django
from django.conf import settings

settings.configure(DEBUG=False, USE_I18N=False)
django.setup()

from django import forms


class KursForma(forms.Form):
    nom = forms.CharField(min_length=2)
    narx = forms.IntegerField(min_value=0)
    chegirma = forms.IntegerField(min_value=0, required=False)

    def clean_nom(self):
        nom = self.cleaned_data["nom"]
        if nom.lower() in ("admin", "root"):
            raise forms.ValidationError("bu nom taqiqlangan")
        return nom.strip().title()          # tozalangan qiymat

    def clean(self):
        tozalangan = super().clean()
        narx = tozalangan.get("narx")
        chegirma = tozalangan.get("chegirma")
        if narx and chegirma and chegirma > narx:
            raise forms.ValidationError("chegirma narxdan katta bo'lmasin")
        return tozalangan


def main() -> None:
    print("=== 1. clean_nom tozalaydi (title) ===")
    forma = KursForma({"nom": "  python  ", "narx": "100"})
    forma.is_valid()
    print(f"  nom (tozalangan): {forma.cleaned_data['nom']!r}")

    print("\n=== 2. Taqiqlangan nom ===")
    forma = KursForma({"nom": "admin", "narx": "100"})
    forma.is_valid()
    print(f"  xato: {list(forma.errors['nom'])}")

    print("\n=== 3. clean() (butun forma — chegirma) ===")
    forma = KursForma({"nom": "Python", "narx": "100", "chegirma": "150"})
    forma.is_valid()
    print(f"  forma xatosi: {list(forma.errors['__all__'])}")

    print("\n=== 4. To'g'ri chegirma ===")
    forma = KursForma({"nom": "Python", "narx": "100", "chegirma": "20"})
    print(f"  is_valid: {forma.is_valid()}")
    print("  ⭐ clean_<maydon> — maydon; clean() — butun forma (aloqa)")


if __name__ == "__main__":
    main()

Natijaning muhim qismi:

text
=== 1. clean_nom tozalaydi (title) ===
  nom (tozalangan): 'Python'

=== 2. Taqiqlangan nom ===
  xato: ['bu nom taqiqlangan']

=== 3. clean() (butun forma — chegirma) ===
  forma xatosi: ["chegirma narxdan katta bo'lmasin"]

=== 4. To'g'ri chegirma ===
  is_valid: True
  ⭐ clean_<maydon> — maydon; clean() — butun forma (aloqa)

Nima ko'rsatdi: 2.5-bo'lim.

Misol 4 — Amaliy: ModelForm va saqlash

ModelForm forma'ni model'dan avtomatik yaratadi va to'g'ridan bazaga saqlaydi. To'liq oqimni ko'rsatami: forma → validatsiya → saqlash — bu real Django ma'lumot qabul qilishining namunasi.

python
"""ModelForm (model'dan forma); form.save() bazaga; validatsiya; to'liq oqim (forma → tekshiruv → saqlash)."""

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"],
    USE_I18N=False,
    DEFAULT_AUTO_FIELD="django.db.models.BigAutoField",
)
_app = types.ModuleType("wisar")
_app.__path__ = [tempfile.gettempdir()]
sys.modules["wisar"] = _app
django.setup()

from django import forms
from django.db import connection, models


class Kurs(models.Model):
    nom = models.CharField(max_length=100)
    narx = models.IntegerField()
    til = models.CharField(max_length=10, default="uz")

    class Meta:
        app_label = "wisar"

    def __str__(self):
        return self.nom


class KursForma(forms.ModelForm):
    class Meta:
        model = Kurs
        fields = ["nom", "narx", "til"]

    def clean_narx(self):
        narx = self.cleaned_data["narx"]
        if narx < 0:
            raise forms.ValidationError("narx manfiy bo'lmasin")
        return narx


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

    print("=== 1. ModelForm (model'dan) ===")
    forma = KursForma({"nom": "Python", "narx": "100", "til": "uz"})
    print(f"  is_valid: {forma.is_valid()}")
    print(f"  maydonlar: {list(forma.fields.keys())}")

    print("\n=== 2. save() — bazaga ===")
    obj = forma.save()
    print(f"  saqlandi: id={obj.id}, nom={obj.nom}")
    print(f"  bazada: {Kurs.objects.count()} kurs")

    print("\n=== 3. Validatsiya (manfiy narx) ===")
    forma2 = KursForma({"nom": "Go", "narx": "-5", "til": "en"})
    forma2.is_valid()
    print(f"  xato: {list(forma2.errors['narx'])}")
    print(f"  saqlanmadi: bazada hali {Kurs.objects.count()} kurs")

    print("\n=== 4. To'liq oqim ===")
    KursForma({"nom": "Rust", "narx": "150", "til": "en"}).save() if KursForma({"nom": "Rust", "narx": "150", "til": "en"}).is_valid() else None
    print(f"  jami saqlangan: {Kurs.objects.count()}")
    print("  ⭐ ModelForm — model'dan forma; save() bazaga; validatsiya birga")


if __name__ == "__main__":
    main()

Natijaning muhim qismi:

text
=== 1. ModelForm (model'dan) ===
  is_valid: True
  maydonlar: ['nom', 'narx', 'til']

=== 2. save() — bazaga ===
  saqlandi: id=1, nom=Python
  bazada: 1 kurs

=== 3. Validatsiya (manfiy narx) ===
  xato: ["narx manfiy bo'lmasin"]
  saqlanmadi: bazada hali 1 kurs

=== 4. To'liq oqim ===
  jami saqlangan: 2
  ⭐ ModelForm — model'dan forma; save() bazaga; validatsiya birga

Nima ko'rsatdi: 2.6, 2.7-bo'limlar.


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

Noto'g'ri fikr To'g'risi
"Ma'lumotni qo'lda tekshirish" Forma (avtomatik)
"forms.CharField = models.CharField" Forma va model maydonlari farq
"is_validsiz cleaned_data" Avval is_valid()
"Xato xabari inglizcha qolsin" error_messages (o'zbekcha)
"ModelForm keraksiz" Model'dan forma (takrorsiz)
"CSRF token keraksiz" Majburiy (xavfsizlik)
"Validatsiya faqat maydonda" clean() — butun forma
"Forma HTML'ni qo'lda" {{ forma.as_p }} avtomatik

6. Keng tarqalgan xatolar va yechimlari

1. is_valid()siz cleaned_data

python
forma.cleaned_data                           # ❌ is_valid'siz yo'q
if forma.is_valid(): forma.cleaned_data      # ✅

2. CSRF token unutish

html
<form method="post">{{ forma.as_p }}</form>  <!-- ⚠️ CSRF yo'q -->
<form method="post">{% csrf_token %}...</form> <!-- ✅ -->

3. clean_<maydon>da return unutish

python
def clean_nom(self):
    nom = self.cleaned_data["nom"].strip()   # ❌ return yo'q
    return nom                                # ✅

4. Model va forma maydonini chalkashtirish

python
nom = models.CharField(max_length=100)       # ⚠️ formada
nom = forms.CharField(max_length=100)        # ✅ formada

5. ModelForm'da Meta yo'q

python
class KursForma(forms.ModelForm): ...        # ❌ model/fields kerak
class Meta: model = Kurs; fields = [...]      # ✅

6. Xato xabarini moslashtirmaslik

python
nom = forms.CharField(min_length=2)          # inglizcha xato
error_messages={"min_length": "..."}          # ✅ o'zbekcha

7. Butun forma validatsiyasida clean_<maydon>

python
# ikki maydon aloqasi clean_narx'da              # ⚠️ boshqa maydon yo'q
def clean(self): ...                              # ✅ butun forma

7. Integratsiya — bu bilim qayerda kerak bo'ladi

  • 21.3-dars (o'tilgan): model — ModelForm manbai
  • 21.6/21.7-dars (o'tilgan): view/template — forma ko'rsatish
  • 20.5-dars (o'tilgan): Pydantic — forma taqqoslash
  • 21.11-dars: auth — kirish/ro'yxat formalari
  • 21.13-dars: DRF serializer — API forma

8. Eng yaxshi amaliyotlar

  1. Foydalanuvchi ma'lumotini forma bilan qabul qiling.

  2. is_valid() dan keyin cleaned_data ishlating.

  3. error_messages bilan o'zbekcha xato xabarlari.

  4. ModelForm bilan model'dan forma (takrorsiz).

  5. clean_<maydon> va clean() bilan maxsus validatsiya.

  6. {% csrf_token %} ni har POST forma'da bering.

  7. clean_<maydon>da tozalangan qiymatni return qiling.

  8. Forma'ni {{ forma.as_p }} bilan ko'rsating.


9. Amaliy topshiriq

Vazifa 1: Bashorat qiling

python
1.  # forma nima?
2.  # forms.CharField va models.CharField farqi?
3.  # is_valid() nima?
4.  # cleaned_data nima?
5.  # error_messages nima?
6.  # clean_<maydon> nima?
7.  # clean() nima?
8.  # ModelForm nima?
9.  # form.save() nima?
10. # csrf_token nima?
11. # errors nima?
12. # as_p nima?
Javoblar
  1. Foydalanuvchi ma'lumotini qabul qilish/validatsiya sxemasi
  2. Forma maydoni (kiritish) vs model maydoni (baza)
  3. Ma'lumotni tekshiradi (True/False)
  4. Tozalangan, aylantirilgan ma'lumot
  5. Xato xabarini moslashtirish (o'zbekcha)
  6. Bir maydon uchun maxsus validatsiya
  7. Butun forma validatsiyasi (maydonlar aloqasi)
  8. Model'dan avtomatik forma
  9. Forma'ni bazaga saqlaydi (ModelForm)
  10. CSRF himoya token (majburiy)
  11. Maydon bo'yicha xatolar
  12. Forma'ni HTML <p> bilan chiqaradi

Vazifa 2: Xatolarni tuzating

python
1.  forma.cleaned_data                    # is_valid yo'q

2.  <form>{{ forma.as_p }}</form>         # csrf

3.  def clean_nom(self):
        nom = self.cleaned_data["nom"]     # return yo'q

4.  class KursForma(forms.ModelForm): ... # Meta

5.  nom = forms.CharField(min_length=2)   # xato xabari
Javoblar
python
1.  if forma.is_valid(): forma.cleaned_data

2.  <form method="post">{% csrf_token %}{{ forma.as_p }}</form>

3.  def clean_nom(self):
        return self.cleaned_data["nom"].strip()

4.  class Meta:
        model = Kurs
        fields = ["nom", "narx"]

5.  nom = forms.CharField(min_length=2, error_messages={"min_length": "..."})

Vazifa 3: Ro'yxatdan o'tish formasi

Registratsiya forma:

  1. ism, email, parol (min_length=8)
  2. clean_parol — kuchli parol
  3. clean() — parol tasdiqlash
  4. Validatsiyani test

Vazifa 4: O'zbekcha xatolar

Xato xabarlarini moslashtiring:

  1. Barcha maydonga error_messages
  2. required, min_length, invalid
  3. Turli xato holatlari
  4. Xato matnini tekshirish

Vazifa 5: ModelForm CRUD

ModelForm bilan:

  1. Model va ModelForm
  2. Yaratish (save())
  3. Yangilash (instance=)
  4. Validatsiya bilan test

Vazifa 6: Murakkab validatsiya

Buyurtma forma:

  1. Mahsulot, soni, chegirma
  2. clean_soni (musbat)
  3. clean() (chegirma < jami)
  4. Har holatni test

Vazifa 7: O'ylash

Django forma (va ModelForm) foydalanuvchi ma'lumotini qabul qilish, validatsiya va HTML yaratishni birlashtiradi — 20.5 dagi Pydantic model kabi "yagona manba". Forma'ni bir joyda e'lon qilib, undan validatsiya, xato xabarlari va HTML olishning afzalligi nima, va bu Django (ModelForm model'dan) va FastAPI (Pydantic) da qanday bir xil g'oya turli shaklda uchraydi?

Javob

Qisqa javob: Django forma — foydalanuvchi ma'lumoti sxemasini bir joyda e'lon qiladi, undan validatsiya, tozalash (cleaned_data), xato xabarlari va HTML (as_p) kelib chiqadi. Afzalligi: takror yo'q (bir e'lon), izchil (validatsiya = HTML = xato), saqlash oson (o'zgarish bir joyda). ModelForm yana bir qadam — forma'ni model'dan yaratadi (model → forma → HTML). Bu Pydantic (FastAPI: model → validatsiya + hujjat) bilan bir xil g'oya: ma'lumot shaklini bir joyda e'lon qilib, ko'p natija olish. Turli freymvork, bir tamoyil — "yagona haqiqat manbai".

1. Forma — bir e'lon, ko'p natija

Bir e'lon (forma) Ko'p natija
KursForma Validatsiya
cleaned_data (tozalash)
Xato xabarlari
HTML (as_p)

2. ModelForm — yana bir daraja

Model → ModelForm → HTML: model'dan forma avtomatik (Meta.model). Bir model'dan jadval, admin, forma (21.3, 21.5).

3. Bir g'oya, turli shakl

Freymvork Manba Natija
Django forma Forma sinfi Validatsiya + HTML
Django ModelForm Model Forma + save
FastAPI Pydantic model Validatsiya + hujjat

4. "Yagona manba" universal

Ma'lumot shakli bir joyda e'lon qilinsa — validatsiya, hujjat, HTML, saqlash undan kelib chiqadi. Bu takror va farqlanishni oldini oladi.

5. Muhandislik saboqlari

  1. Ma'lumot shaklini bir joyda e'lon qil
  2. Undan ko'p natija (validatsiya, HTML, saqlash)
  3. Bir g'oya turli freymvorkda (Django, FastAPI)
  4. "Yagona manba" — takrorsiz, izchil

6. Xulosa

  1. Forma — validatsiya + HTML bir manbadan
  2. ModelForm — model'dan forma (yana kam kod)
  3. Pydantic bilan bir g'oya (turli shakl)
  4. "Yagona haqiqat manbai" — universal tamoyil

Nimani mustahkamlaydi: 2.1–2.8-bo'limlar.


Xulosa

Bu darsda Django forma'ni o'rgandik.

Eng muhim uch fikr:

  1. Forma — ma'lumot sxemasi. Forma — forms.Formdan meros olgan sinf; u foydalanuvchi kiritadigan ma'lumot sxemasini (maydonlar, cheklovlar) e'lon qiladi. Forma maydonlari (forms.CharField, forms.IntegerField) o'z validatsiyasiga ega (min_length, min_value). is_valid() ma'lumotni tekshiradi; to'g'ri bo'lsa cleaned_data — tozalangan, aylantirilgan ma'lumot ("100" → 100); xato bo'lsa errors — maydon bo'yicha. Bu 20.5 dagi Pydantic'ning Django versiyasi.

  2. Validatsiya va xato xabarlari. error_messages — xato xabarini moslashtiradi (o'zbekcha). Maxsus validatsiya: clean_<maydon> (bir maydon uchun — raise ValidationError yoki tozalangan return), clean() (butun forma — maydonlar aloqasi, masalan chegirma < narx). Bu 20.5 dagi field_validatorga o'xshaydi — deklarativ, bir joyda.

  3. ModelForm va xavfsizlik. ModelForm — forma'ni model'dan avtomatik yaratadi (Meta.model, fields) — takror yo'q, form.save() to'g'ridan bazaga saqlaydi. Bu "yagona manba" 21.3-bob: model'dan jadval, admin, forma. View forma'ni boshqaradi (GET — bo'sh, POST — tekshiruv/saqlash), template {{ forma.as_p }} bilan HTML'ni avtomatik chiqaradi. {% csrf_token %} — CSRF himoya (majburiy, "xavfsiz standart"). Django forma va Pydantic bir g'oya: ma'lumot shaklini bir joyda e'lon qilib, ko'p natija.

Keyingi darsda ORM: so'rovlar ni o'rganamiz: Django ORM bilan ma'lumot qidiruvini chuqurroq — filter, exclude, Q obyektlari, agregatlar va so'rovlarni optimallashtirish.

Ulashish:Telegram'da

Izohlar (0)

Izoh yozish uchun kiring.

  • Hozircha izoh yo'q. Birinchi bo'ling!
21.8-dars: Forma — IlmHamroh