from django import forms from django.contrib.auth.models import User from .models import Student, Subject, Classroom class StudentRegistrationForm(forms.ModelForm): first_name = forms.CharField(max_length=30, required=True, label="Full Name (First)") last_name = forms.CharField(max_length=30, required=True, label="Full Name (Last)") username = forms.CharField(max_length=150, required=True) email = forms.EmailField(required=True) password = forms.CharField(widget=forms.PasswordInput, required=True) classroom = forms.ModelChoiceField(queryset=Classroom.objects.all(), required=True, empty_label="Select Classroom") subjects = forms.ModelMultipleChoiceField( queryset=Subject.objects.all(), required=False, widget=forms.CheckboxSelectMultiple, label="Select Subjects" ) class Meta: model = Student fields = ['mobile_number', 'moderate', 'city', 'avatar'] widgets = { 'avatar': forms.FileInput(attrs={'accept': 'image/*', 'capture': 'camera'}), # generic hint, but we'll use custom JS } def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) # optimize subjects loading self.fields['subjects'].queryset = Subject.objects.none() if 'classroom' in self.data: try: classroom_id = int(self.data.get('classroom')) self.fields['subjects'].queryset = Subject.objects.filter(classroom_id=classroom_id) except (ValueError, TypeError): pass elif self.instance.pk and self.instance.classroom: self.fields['subjects'].queryset = Subject.objects.filter(classroom=self.instance.classroom) def save(self, commit=True): # We need to save the User first, then the Student user = User.objects.create_user( username=self.cleaned_data['username'], email=self.cleaned_data['email'], password=self.cleaned_data['password'], first_name=self.cleaned_data['first_name'], last_name=self.cleaned_data['last_name'] ) student = super().save(commit=False) student.user = user student.classroom = self.cleaned_data['classroom'] if commit: student.save() student.subscribed_subjects.set(self.cleaned_data['subjects']) return student