Форма django не отображается в шаблоне для добавления данных

Целью моего кода является создание системы управления школой, в которой администратор может войти в систему и добавить учителей в соответствующие классы, которые они ведут, и иметь возможность добавлять учеников в соответствующие классы, а затем учитывать посещаемость тех учеников, которые присутствуют в любой данный день. Я искал, но не могу найти ошибку в моем коде, я новичок в Django, поэтому любая помощь будет оценена по достоинству. Самое близкое, что мне удалось сделать, это заставить модальную форму отображаться, но поля для выбора ученика для добавления в класс не отображались

модели

просмотров

 # create a classroom
login_required()
def class_view(request):
    form = ClassRoomForm()
    if request.method == 'POST':
        form = ClassRoomForm(request.POST)
        if form.is_valid():
            form.save()

            name = form.cleaned_data.get('name')

            messages.success(request, f'{name} was Successfully Added')
            return redirect('classroom')

    classes = Room.objects.all()
    return render(request, 'school/class_view.html', {"form": form, 'classes': classes})

@login_required
def class_detail(request,pk):
    _class = Room.objects.filter(id=pk).first()
    students = ClassStudent.objects.filter(classIns =_class).all()
    print(students)

    context = {
        'class': _class,
        'students': students
    }

    return render(request, "school/class_info.html", context)


@login_required
def save_class_student(request):
    form = SaveClassStudent()
    if request.method == 'POST':
        form = SaveClassStudent(request.POST)
        if form.is_valid():
            form.save()
            messages.success(request, "Student has been added successfully.")
            redirect('')
      
    return render(request, 'school/class_info.html', {'form': form})

формы

class ClassRoomForm(forms.ModelForm):
    school_year = forms.CharField(max_length=250,help_text = "School Year Field is required.")
    level = forms.CharField(max_length=250,help_text = "Level Field is required.")
    name = forms.CharField(max_length=250,help_text = "Class Name Field is required.")


    class Meta:
        model = Room
        fields = ('form_teacher', 'name', 'level', 'school_year')

class SaveClassStudent(forms.ModelForm):
    classIns = forms.IntegerField()
    student = forms.IntegerField()

    class Meta:
        model = ClassStudent
        fields = ('classIns', 'student')

    def clean_classIns(self):
        cid = self.cleaned_data['classIns']
        try:
            classIns = Room.objects.get(id=cid)
            return classIns
        except:
            raise forms.ValidationError("Class ID is Invalid.")

    def clean_student(self):
        student_id = self.cleaned_data['student']
        _class = Room.objects.get(id=self.data.get('classIns'))
        student = Student.objects.get(id=student_id)
        try:
            cs = ClassStudent.objects.get(classIns=_class, student=student)
            if len(cs) > 0:
                raise forms.ValidationError(
                    f"Student already exists in the Class List.")
        except:
            return student

Вот несколько рекомендаций. Во-первых, в вашем forms.py вы пересоздаете существующие поля, а это не обязательно. Например:

class ClassRoomForm(forms.ModelForm):
     # school_year = forms.CharField(max_length=250,help_text = "School Year Field is required.")
     # level = forms.CharField(max_length=250,help_text = "Level Field is required.")
     # name = forms.CharField(max_length=250,help_text = "Class Name Field is required.")

     # There's no need to re-create the above since they're in the Room model already.

    
     class Meta:
         model = Room
         fields = ('form_teacher', 'name', 'level', 'school_year')
          
         # What you need to do is to use the widget attribute on the Class Meta to set the help_text and the max_length.
         widgets = {
              'name': forms.TextInput(attr={'class':'form-control'}, max_length=250, help_text='Class Name Field is required.'),
              'level': forms.TextInput(attr={'class':'form-control'}, max_length=250, help_text='Level Field is required.'),
              'school_year': forms.TextInput(attr={'class':'form-control'}, max_length=250, help_text='School Year Field is required.'),
         }

Вы можете использовать этот подход и для других форм, которые у вас есть.

Во-вторых, поскольку вы упомянули, что метод save_class_student передает форму, я бы предложил использовать {{ form.student }}, если вы хотите отобразить поле формы, которую вы передаете шаблону.

<form class="row g-3" method="post">
     {% csrf_token %}
     ...
     <label class="form-label">Student</label>
     {{ form.student }}
     ...
</form>
Вернуться на верх