Фильтр Выпадающее поле внешнего ключа Django - PullRequest
0 голосов
/ 14 февраля 2020

У меня есть 3 таблицы Student, K8Points и TeacherClass. Таблица учеников отслеживает всю информацию о студентах, и вы можете назначить их классной комнате, баллы отслеживают баллы, которые они заработали за день, таблица классных комнат - это то, где вы создаете имена классных комнат. Чего я хочу достичь sh, когда вы вошли в / k8_points_classroom / 1? страница, есть раскрывающееся поле студентов. 1 в конце класса - идентификатор класса. Поле student_name должно показывать только детей в этом конкретном классе, как мне отфильтровать это поле? Прямо сейчас это просто подтягивает каждого студента в базе данных. Спасибо за помощь.

Модель


class TeacherClass(models.Model):
    class_name = models.CharField(max_length = 50, default= "")
    teacher_name = models.ManyToManyField(User)
    grade = models.CharField(max_length = 2, default= "")


    class Meta:
       verbose_name = "Teacher Class Room"

    def __str__(self):
        return self.class_name


class Student(models.Model):
    studentpsid= models.CharField(primary_key = True , default = "", max_length = 50, unique = True)
    student_name = models.CharField(max_length = 50)
    student_grade = models.CharField(max_length = 2, default = "")
    home_room = models.CharField(max_length = 3, default = "")
    counseling_goal = models.TextField(max_length = 255)
    class_name = models.ManyToManyField(TeacherClass)
    image =models.ImageField(default ="default.png", upload_to='student_pics')


class K8Points(models.Model):
    date = models.DateField(default=datetime.date.today) 
    class_name = models.ForeignKey(TeacherClass, on_delete = models.PROTECT, default = "",)
    student_name = models.ForeignKey(Student,on_delete = models.CASCADE, default ="" ,) 
    week_of = models.IntegerField(default=weeknumber)
    day = models.CharField(max_length= 10, default = dayofweek)
    TIME_FRAME_CHOICES = [
        (None, 'PLEASE SELECT TIME FRAME'),  
        (1, '(1.) 8:45AM - 9:00AM'),
        (2, '(2.) 9:00AM - 9:30AM'),
        (3, '(3.) 9:30AM - 10:00AM'),
        (4, '(4.) REC. I 10:00AM -10:10AM'),
        (5, '(5.) 10:10AM-10:40AM'),
        (6, '(6.) 10:40AM-11:10AM'),
        (7, '(7.) 11:10AM-11:40AM'),
        (8, '(8.) LUNCH 11:40AM-12:00PM'),
        (9, '(9.) REC. II 12:00PM-12:20PM'),
        (10, '(10.) 12:20PM-12:50PM'),
        (11,'(11.) 12:50PM-1:20PM'),
        (12,'(12.) 1:20PM-1:50PM'),
        (13,'(13.) 1:50PM-2:20PM'),
        (14,'(14.) REC. III 2:20PM-2:30PM'),
    ]
    time_frame = models.PositiveSmallIntegerField(choices=TIME_FRAME_CHOICES,)
    behavior = models.IntegerField(default="", validators=[
            MaxValueValidator(5),
            MinValueValidator(1)
        ])
    academic = models.IntegerField(default="", validators=[
            MaxValueValidator(5),
            MinValueValidator(0)
        ] )

    created_at = models.DateTimeField(default = timezone.now)


    class Meta:
        verbose_name = "K8-Points"


    def __str__(self):
        return self.student_name

Форма


    def __init__(self, *args, **kwargs):
          self.classid = kwargs.pop('classid', None)
          super(K8Points_ClassroomForm,self).__init__(*args,**kwargs)
          self.fields['date'].disabled = True
          self.fields['day'].disabled = True
          self.fields['week_of'].disabled = True
          self.fields['class_name'].widget.attrs['readonly'] = True  
          getstudents = Student.objects.filter(class_name = self.classid).order_by('student_name')
          self.fields['student_name'].queryset= getstudents.all().order_by('student_name')

Вид

@login_required
def K8_Points_Classroom(request, classid):

    if request.method == "GET":

        date = datetime.date.today()
        students = Student.objects.filter(class_name=classid).order_by('student_name')
        class_name = TeacherClass.objects.get(id=classid)
        form = K8Points_ClassroomForm(classid = class_name.id)
        request.session['my_class_id'] = classid
        return render(request, 'points/k8_points_classroom.html', {'form': form, 'students': students, 'class_name': class_name, 'date': date , 'classid': classid})

1 Ответ

0 голосов
/ 14 февраля 2020

Вам необходимо передать класс в качестве параметра в форму в представлении, а затем настроить набор запросов поля student_name для фильтрации по ученикам этого класса.

class K8PointsClassroomForm(forms.ModelForm):
    def __init__(self, *args, class_=None, **kwargs):
          super (K8Points_ClassroomForm,self).__init__(*args,**kwargs )
          self.fields['date'].disabled = True
          self.fields['day'].disabled = True
          self.fields['week_of'].disabled = True
          # Limit the fields queryset to that of the class's students.
          self.fields['student_name'].queryset = class_.student_set.all()

Редактировать:

Вот мнение, которое я пытался объяснить:

@login_required
def K8_Points_Classroom(request, classid):
    class_name = TeacherClass.objects.get(id=classid)
    form = K8Points_ClassroomForm(class_=class_name)
...