Mundarija (22)
- 1. Kirish va motivatsiya
- 2. Nazariya — chuqur tushuntirish
- 2.1. Forma sinfi
- 2.2. Forma maydonlari va validatsiya
- 2.3. is_valid() va cleaned_data
- 2.4. Xato xabarlari
- 2.5. Maxsus validatsiya
- 2.6. ModelForm
- 2.7. Forma'ni ko'rsatish va saqlash
- 2.8. Forma va CSRF himoya
- 3. Tez ma'lumotnoma
- 4. Batafsil misollar
- Misol 1 — Forma va validatsiya
- Misol 2 — Xato xabarlari (o'zbekcha)
- Misol 3 — Maxsus validatsiya (clean_<maydon>)
- Misol 4 — Amaliy: ModelForm va saqlash
- 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.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()vacleaned_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
formsbilan sinaladi.
2. Nazariya — chuqur tushuntirish
2.1. Forma sinfi
Forma — forms.Formdan meros olgan sinf (maydonlar bilan):
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 |
Format tekshiruvi | |
BooleanField |
True/False | — |
ChoiceField |
Tanlov | choices |
DateField |
Sana | Format |
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:
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):
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:
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:
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:
# 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})<!-- 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
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 # xatolarForma oqimi
POST → Forma(data) → is_valid() → cleaned_data/save() yoki errors
template: {% csrf_token %} {{ forma.as_p }}4. Batafsil misollar
Misollarda Django
formsbilan sinaladi.
Misol 1 — Forma va validatsiya
"""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:
=== 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 tozalaydiNima ko'rsatdi: 2.1, 2.2, 2.3-bo'limlar.
Misol 2 — Xato xabarlari (o'zbekcha)
"""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:
=== 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'yichaNima ko'rsatdi: 2.3, 2.4-bo'limlar.
Misol 3 — Maxsus validatsiya (clean_<maydon>)
"""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:
=== 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.
"""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:
=== 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 birgaNima 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
forma.cleaned_data # ❌ is_valid'siz yo'q
if forma.is_valid(): forma.cleaned_data # ✅2. CSRF token unutish
<form method="post">{{ forma.as_p }}</form> <!-- ⚠️ CSRF yo'q -->
<form method="post">{% csrf_token %}...</form> <!-- ✅ -->3. clean_<maydon>da return unutish
def clean_nom(self):
nom = self.cleaned_data["nom"].strip() # ❌ return yo'q
return nom # ✅4. Model va forma maydonini chalkashtirish
nom = models.CharField(max_length=100) # ⚠️ formada
nom = forms.CharField(max_length=100) # ✅ formada5. ModelForm'da Meta yo'q
class KursForma(forms.ModelForm): ... # ❌ model/fields kerak
class Meta: model = Kurs; fields = [...] # ✅6. Xato xabarini moslashtirmaslik
nom = forms.CharField(min_length=2) # inglizcha xato
error_messages={"min_length": "..."} # ✅ o'zbekcha7. Butun forma validatsiyasida clean_<maydon>
# ikki maydon aloqasi clean_narx'da # ⚠️ boshqa maydon yo'q
def clean(self): ... # ✅ butun forma7. Integratsiya — bu bilim qayerda kerak bo'ladi
- 21.3-dars (o'tilgan): model —
ModelFormmanbai - 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
Foydalanuvchi ma'lumotini forma bilan qabul qiling.
is_valid()dan keyincleaned_dataishlating.error_messagesbilan o'zbekcha xato xabarlari.ModelFormbilan model'dan forma (takrorsiz).clean_<maydon>vaclean()bilan maxsus validatsiya.{% csrf_token %}ni har POST forma'da bering.clean_<maydon>da tozalangan qiymatnireturnqiling.Forma'ni
{{ forma.as_p }}bilan ko'rsating.
9. Amaliy topshiriq
Vazifa 1: Bashorat qiling
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
- Foydalanuvchi ma'lumotini qabul qilish/validatsiya sxemasi
- Forma maydoni (kiritish) vs model maydoni (baza)
- Ma'lumotni tekshiradi (True/False)
- Tozalangan, aylantirilgan ma'lumot
- Xato xabarini moslashtirish (o'zbekcha)
- Bir maydon uchun maxsus validatsiya
- Butun forma validatsiyasi (maydonlar aloqasi)
- Model'dan avtomatik forma
- Forma'ni bazaga saqlaydi (
ModelForm) - CSRF himoya token (majburiy)
- Maydon bo'yicha xatolar
- Forma'ni HTML
<p>bilan chiqaradi
Vazifa 2: Xatolarni tuzating
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 xabariJavoblar
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:
- ism, email, parol (
min_length=8) clean_parol— kuchli parolclean()— parol tasdiqlash- Validatsiyani test
Vazifa 4: O'zbekcha xatolar
Xato xabarlarini moslashtiring:
- Barcha maydonga
error_messages required,min_length,invalid- Turli xato holatlari
- Xato matnini tekshirish
Vazifa 5: ModelForm CRUD
ModelForm bilan:
- Model va
ModelForm - Yaratish (
save()) - Yangilash (
instance=) - Validatsiya bilan test
Vazifa 6: Murakkab validatsiya
Buyurtma forma:
- Mahsulot, soni, chegirma
clean_soni(musbat)clean()(chegirma < jami)- 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
- Ma'lumot shaklini bir joyda e'lon qil
- Undan ko'p natija (validatsiya, HTML, saqlash)
- Bir g'oya turli freymvorkda (Django, FastAPI)
- "Yagona manba" — takrorsiz, izchil
6. Xulosa
- Forma — validatsiya + HTML bir manbadan
- ModelForm — model'dan forma (yana kam kod)
- Pydantic bilan bir g'oya (turli shakl)
- "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:
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'lsacleaned_data— tozalangan, aylantirilgan ma'lumot ("100"→100); xato bo'lsaerrors— maydon bo'yicha. Bu 20.5 dagi Pydantic'ning Django versiyasi.Validatsiya va xato xabarlari.
error_messages— xato xabarini moslashtiradi (o'zbekcha). Maxsus validatsiya:clean_<maydon>(bir maydon uchun —raise ValidationErroryoki tozalanganreturn),clean()(butun forma — maydonlar aloqasi, masalan chegirma < narx). Bu 20.5 dagifield_validatorga o'xshaydi — deklarativ, bir joyda.ModelFormva 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.
Izohlar (0)
Izoh yozish uchun kiring.
- Hozircha izoh yo'q. Birinchi bo'ling!