Kod namunalari
Bu yerda loyihaning haqiqiy kodidan olingan (soddalashtirilgan) 4 ta parcha bor — har biri "Django va OOP" hamda "Kirish va rollar" bo'limlarida aytilgan g'oyalarning aslida qanday yozilishini ko'rsatadi.
1Model — ma'lumot qanday tasvirlanadi
Talaba haqidagi ma'lumot backend'da shunday "blank-forma" (model) sifatida yozilgan:
backend/apps/accounts/models.py
class Student(BaseModel): full_name = CharField(max_length=200) faculty = CharField(max_length=200) student_id = CharField(unique=True, max_length=60) password_hash = CharField(max_length=255) sport_type = ForeignKey("sports.SportType") weekly_star = BooleanField(default=False) monthly_star = BooleanField(default=False)
Har bir qator — bazadagi bitta ustun. ForeignKey — "Talaba" jadvalidan "Sport turi" jadvaliga bog'lanish (4-bo'limda gaplashgan g'oya). Bu klass yozilgan zahoti, Django avtomatik ravishda bazada mos jadval va ustunlarni yaratadi — dasturchi qo'lda SQL buyrug'i yozishi shart emas.
2View — so'rovga qanday javob beriladi
Foydalanuvchi /api/sports/ manzilini so'raganda ishga tushadigan haqiqiy kod:
backend/apps/sports/views.py
class SportTypeListView(APIView): # GET /api/sports/ — ochiq (kirish shart emas) permission_classes = [AllowAny] def get(self, request): sportlar = SportType.objects.all() if request.query_params.get("active") == "1": sportlar = sportlar.filter(active=True) return Response({"items": SportTypeListSerializer(sportlar, many=True).data})
Bu — restoran misolidagi "oshpaz". Bazadan ma'lumot so'raydi (SportType.objects.all()), kerak bo'lsa filtrlaydi, so'ng frontend tushunadigan formatga o'girib (Serializer) qaytaradi.
3Kirish tekshiruvi — "chiptani" o'qish
Har bir so'rovda foydalanuvchi kimligini aniqlaydigan funksiya (6-bo'limdagi "chipta" tushunchasi shu yerda amalga oshadi):
backend/core/auth.py
def get_session(request): token = request.COOKIES.get("tobb_etu_session") if not token: return None # chipta yo'q — mehmon sifatida davom etadi return decode_token(token) # chiptani "o'qiydi"
Agar brauzerda "chipta" (cookie) bo'lmasa yoki u soxta/muddati o'tgan bo'lsa, funksiya None qaytaradi — va tizim foydalanuvchini oddiy mehmon sifatida ko'radi, hech qanday maxsus amalga ruxsat bermaydi.
4Frontend — tugma o'z holatini qanday biladi
"Shu sportga qo'shilish" tugmasi uchta holatni bilishi kerak: yuklanmoqda, allaqachon a'zo, yoki hali emas. React'da bu "state" (holat) orqali boshqariladi:
frontend/src/components/sport/JoinSportButton.tsx
const [joining, setJoining] = useState(false); // tugma bosilganda: setJoining(true); const res = await fetch("/api/profile/sports", { method: "POST", body: JSON.stringify({ sportTypeId: sportId }), }); setJoining(false); if (res.ok) showToast("success", "Sportga a'zo bo'ldingiz!");
"State" nima? Bu — komponentning "xotirasi": joining qiymati true bo'lsa, tugma "yuklanmoqda" ko'rinishini oladi; false bo'lsa — oddiy holatga qaytadi. Qiymat o'zgarganda, React ekranni AVTOMATIK qayta chizadi — dasturchi buni qo'lda qilishi shart emas.
5Bu to'rttasi birgalikda
Yuqoridagi to'rt parcha — bitta oddiy amalning (masalan, sportga a'zo bo'lish) to'rt bosqichini ko'rsatadi: Model (ma'lumot qanday saqlanadi) → View (so'rovga qanday javob beriladi) → Auth (kim so'rayotgani tekshiriladi) → Frontend (foydalanuvchiga natija qanday ko'rsatiladi). Butun loyiha — shu bosqichlarning turli mavzular (sport, turnir, yangilik...) uchun ko'p marta takrorlanishidan iborat.