بداية، ستحتاج إلى إنشاء نموذج Django يعبر عن البيانات التي تريد تخزينها لنفترض أنك تريد حفظ اختيار المستخدم في حقل يسمى 'choice' فأول خطوة كما ذكرنا هي إنشاء النموذج على النحو التالي في ملف `models.py`:
from django.db import models
class ChoiceModel(models.Model):
CHOICES = [
('option1', 'Option 1'),
('option2', 'Option 2'),
('option3', 'Option 3'),
]
choice = models.CharField(max_length=10, choices=CHOICES)
def __str__(self):
return self.choice
وهذا النموذج يحتوي على حقل يتضمن خيارات ثابتة يمكن للمستخدم الاختيار منها.
ثاني شيء ستحتاج إلى إنشاء نموذج Form يعرض القائمة المنسدلة في HTML ننشؤه من خلال ملف forms.py على النحو التالي:
from django import forms
from .models import ChoiceModel
class ChoiceForm(forms.ModelForm):
class Meta:
model = ChoiceModel
fields = ['choice']
ولتوضيح الفكرة فهذا النموذج يستخدم النموذج الذي أنشأته في الخطوة السابقة لعرض القائمة المنسدلة في HTML.
بعدها ستحتاج إلى إنشاء عرض أو (View) يعرض النموذج ويتعامل مع البيانات المرسلة من المستخدم ننشؤه في ملف views.py على النحو التالي:
from django.shortcuts import render, redirect
from .forms import ChoiceForm
def choice_view(request):
if request.method == 'POST':
form = ChoiceForm(request.POST)
if form.is_valid():
form.save()
return redirect('success')
else:
form = ChoiceForm()
return render(request, 'choice_form.html', {'form': form})
هذا العرض يتأكد من أن النموذج يتم عرضه بشكل صحيح ويتعامل مع إرسال البيانات فإذا كان الطلب من نوع POST يتم التحقق من صحة النموذج وحفظ البيانات في قاعدة البيانات لكن سنحتاج إلى إنشاء قالب HTML يعرض النموذج. يمكنك إنشاء هذا القالب في ملف choice_form.html داخل مجلد `templates` على النحو التالي:
<!-- templates/choice_form.html -->
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Choice Form</title>
</head>
<body>
<h1>اختر من القائمة المنسدلة</h1>
<form method="post">
{% csrf_token %}
{{ form.as_p }}
<button type="submit">إرسال</button>
</form>
</body>
</html>
الخطأ الذي يظهر عند تشغيل هذا الكود يرجع إلى أن عملية التقاطع (`&`) غير مدعومة مباشرة بين كائنات `pd.Index` في مكتبة `pandas`. لاستخدام عملية التقاطع بين مجموعتين من المؤشرات، يجب استخدام الدالة `intersection` بدلا من ذلك. إليك الكود المعدل:
import pandas as pd
arr0 = pd.Index([0,1,2,3,4])
arr1 = pd.Index([0,1,2])
print(arr0.intersection(arr1))
فهذا الكود سيعطيك التقاطع الصحيح بين المؤشرين `arr0` و `arr1`.
الخطأ الذي ظهر في الصورة التي قدمتها يعود إلى أن الدالة `range(len(students))` تولد قيم من 0 إلى عدد الطلاب الذي يزيد عن عدد الأوقات المتاحة في قائمة `appointment_times`. بما أن عدد الأوقات هو 4 فقط، ولكنك تحاول الوصول إلى فهرس في القائمة يتجاوز هذا العدد، فإنه ينتج عن ذلك خطأ `IndexError: list index out of range`.
هذا الخطأ يحدث عندما يكون عدد الطلاب أكبر من عدد الأوقات المتوفرة في `appointment_times` وتحاول الوصول إلى فهرس غير موجود في قائمة الأوقات.
لنحل هذه المشكلة، يجب التأكد من عدم تجاوز الدورة لعدد الأوقات المتاحة، أو كما في المثال التالي الذي يضمن توزيع الطلاب بطريقة تضمن عدم حدوث هذا التجاوز:
students = ['جاسم', 'خلف', 'عبدالله', 'زيد', 'ممدوح']
appointment_times = ['9:00', '9:30', '10:00', '10:30']
# طباعة المواعيد لأول ثلاث طلاب
for i in range(min(3, len(students))): # يضمن هذا عدم تجاوز القائمة إذا كان عدد الطلاب أقل من 3
print(f"{students[i]} بالساعة {appointment_times[i]}")
# توزيع الطلاب الباقين على الموعد الأخير
for i in range(3, len(students)):
print(f"{students[i]} بالساعة {appointment_times[-1]}")
هذا الكود سيضمن توزيع الطلاب الثلاثة الأوائل على المواعيد الثلاثة الأولى، والطلاب الباقين جميعا على الموعد الأخير (10:30)، وهذه الطريقة تعمل حتى لو كان عدد الطلاب أقل من ثلاثة.