Rahul
Rahul

Reputation: 17

Display the value of current foreignkey in update form when limiting queryset choice

I have a model named TimeTable (as shown below). In my update form I want to display the current value of the foreignkey field (say 'mon_1'). Since I am limiting the foreignkey choices using queryset in my form, the current value isn't being displayed. So i set initial value of the field 'mon_1' as the current model instance's mon_1, but it does not work. What is the mistake I am doing

#models.py

class TimeTable(models.Model):
    standard_choice = (
        ('Grade 1','Grade 1'),
        ('Grade 2','Grade 2'),
        ('Grade 3','Grade 3'),
        ('Grade 4','Grade 4'),
        ('Grade 5','Grade 5'),
        ('Grade 6','Grade 6'),
        ('Grade 7','Grade 7'),
        ('Grade 8','Grade 8'),
        ('Grade 9','Grade 9'),
        ('Grade 10','Grade 10'),
        ('Grade 11','Grade 11'),
        ('Grade 12','Grade 12'),
    )

    section_choice = (
        ('A','A'),
        ('B','B'),
        ('C','C'),
        ('D','D'),
    )

    standard = models.CharField(max_length=256,choices=standard_choice)
    section = models.CharField(max_length=1,choices=section_choice)

    mon_1 = models.ForeignKey(Teachers,on_delete=models.CASCADE,related_name='mon_1_subject_teacher')
    mon_2 = models.ForeignKey(Teachers,on_delete=models.CASCADE,related_name='mon_2_subject_teacher')
    mon_3 = models.ForeignKey(Teachers,on_delete=models.CASCADE,related_name='mon_3_subject_teacher')
    mon_4 = models.ForeignKey(Teachers,on_delete=models.CASCADE,related_name='mon_4_subject_teacher')
    mon_5 = models.ForeignKey(Teachers,on_delete=models.CASCADE,related_name='mon_5_subject_teacher')

    tue_1 = models.ForeignKey(Teachers,on_delete=models.CASCADE,related_name='tue_1_subject_teacher')
    tue_2 = models.ForeignKey(Teachers,on_delete=models.CASCADE,related_name='tue_2_subject_teacher')
    tue_3 = models.ForeignKey(Teachers,on_delete=models.CASCADE,related_name='tue_3_subject_teacher')
    tue_4 = models.ForeignKey(Teachers,on_delete=models.CASCADE,related_name='tue_4_subject_teacher')
    tue_5 = models.ForeignKey(Teachers,on_delete=models.CASCADE,related_name='tue_5_subject_teacher')

    wednes_1 = models.ForeignKey(Teachers,on_delete=models.CASCADE,related_name='wed_1_subject_teacher')
    wednes_2 = models.ForeignKey(Teachers,on_delete=models.CASCADE,related_name='wed_2_subject_teacher')
    wednes_3 = models.ForeignKey(Teachers,on_delete=models.CASCADE,related_name='wed_3_subject_teacher')
    wednes_4 = models.ForeignKey(Teachers,on_delete=models.CASCADE,related_name='wed_4_subject_teacher')
    wednes_5 = models.ForeignKey(Teachers,on_delete=models.CASCADE,related_name='wed_5_subject_teacher')

    thurs_1 = models.ForeignKey(Teachers,on_delete=models.CASCADE,related_name='thurs_1_subject_teacher')
    thurs_2 = models.ForeignKey(Teachers,on_delete=models.CASCADE,related_name='thurs_2_subject_teacher')
    thurs_3 = models.ForeignKey(Teachers,on_delete=models.CASCADE,related_name='thurs_3_subject_teacher')
    thurs_4 = models.ForeignKey(Teachers,on_delete=models.CASCADE,related_name='thurs_4_subject_teacher')
    thurs_5 = models.ForeignKey(Teachers,on_delete=models.CASCADE,related_name='thurs_5_subject_teacher')

    fri_1 = models.ForeignKey(Teachers,on_delete=models.CASCADE,related_name='fri_1_subject_teacher')
    fri_2 = models.ForeignKey(Teachers,on_delete=models.CASCADE,related_name='fri_2_subject_teacher')
    fri_3 = models.ForeignKey(Teachers,on_delete=models.CASCADE,related_name='fri_3_subject_teacher')
    fri_4 = models.ForeignKey(Teachers,on_delete=models.CASCADE,related_name='fri_4_subject_teacher')
    fri_5 = models.ForeignKey(Teachers,on_delete=models.CASCADE,related_name='fri_5_subject_teacher')


    def  __str__(self):
        return self.standard+' '+self.section+ ' '+ 'TimeTable'

    # This works from one particular standard, but if some teachers take class for two grades , then you have 'ForeignKey'
    # the 'class they take' here and set unique_together constraint - hope it works
    class Meta():
        unique_together = [
        ['standard','section'],

        ['standard','mon_1'],
        ['standard','mon_2'],
        ['standard','mon_3'],
        ['standard','mon_4'],
        ['standard','mon_5'],

        ['standard','tue_1'],
        ['standard','tue_2'],
        ['standard','tue_3'],
        ['standard','tue_4'],
        ['standard','tue_5'],

        ['standard','wednes_1'],
        ['standard','wednes_2'],
        ['standard','wednes_3'],
        ['standard','wednes_4'],
        ['standard','wednes_5'],

        ['standard','thurs_1'],
        ['standard','thurs_2'],
        ['standard','thurs_3'],
        ['standard','thurs_4'],
        ['standard','thurs_5'],

        ['standard','fri_1'],
        ['standard','fri_2'],
        ['standard','fri_3'],
        ['standard','fri_4'],
        ['standard','fri_5'],
        ]

#forms.py

def limit_choices_teachers(period):
    return Teachers.objects.exclude(id__in=TimeTable.objects.values_list(f"{period}_id",flat=True))


class TimeTableUpdateForm(forms.ModelForm):
    
        class Meta():
            model = models.TimeTable
            fields = ('__all__')
        def __init__(self, *args, **kwargs):
            super(TimeTableUpdateForm, self).__init__(*args, **kwargs)
    
            Instance = models.TimeTable.objects.get(pk=self.instance.pk)
            self.fields['mon_1'].initial = Instance.mon_1
    
            self.fields['mon_1'].queryset = limit_choices_teachers('mon_1')

#views.py

class UpdateTimeTable(UpdateView):
    model = models.TimeTable
    form_class = forms.TimeTableUpdateForm
    template_name = 'TimeTableApp/update_timetable.html'
    success_url = reverse_lazy('TimeTableApp:inner_index')

Upvotes: 0

Views: 34

Answers (0)

Related Questions