Как динамически фильтровать представление по выбору ModelChoiceField - PullRequest
0 голосов
/ 22 января 2019

Я создал шаблон, который отображает раскрывающийся список студентов.

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

perm_id в student_list является первичным ключом, а perm в StudentSchedule является внешним ключом.

Здесь приведены фрагменты моих моделей models.py, forms.py и views.py

.py

class StudentList(models.Model):
student_name = models.CharField(max_length=45, blank=True, null=True)
perm_id = models.IntegerField(primary_key=True)

class StudentSchedule(models.Model):
perm = models.ForeignKey(StudentList, on_delete=models.CASCADE)
begin_period = models.CharField(max_length=45, blank=True, null=True)
section_id = models.CharField(max_length=45, blank=True, null=True)
course_title = models.CharField(max_length=45, blank=True, null=True)
last_name1 = models.CharField(max_length=45, blank=True, null=True)

forms.py

class StudentForm(forms.Form):
Student = forms.ModelChoiceField(queryset=StudentList.objects.all()
                                .order_by('student_name'))

views.py

class ScheduleView(View):
   form_class = ScheduleForm
   template_name = 'learning_logs/student_schedule.html'

   def get(self, request):
       form = self.form_class(initial={})
       data = StudentSchedule.objects.filter()
       return render(request, self.template_name, {'form': form, 'data': 
data})

Я могу сделать следующее и получить студента с идентификатором # 123456

data = StudentSchedule.objects.filter(perm=123456)

Но я хочу, чтобы Django использовал perm_id от студента, выбранного из StudentList

Мои URL-адреса следующие:

# Page for selecting a student from drop down list
path('select_student/', views.StudentView.as_view(), name='select_student'),

# Page for displaying student schedule
path('student_schedule/<int:pk>/$', views.ScheduleView.as_view(), 
name='student_schedule'),

1 Ответ

0 голосов
/ 22 января 2019

Скажи, что твой путь похож на

urlpatterns = [
    path('students/<int:pk>/$', views.ScheduleView.as_view(), name='student-detail'),
    ...
]

Затем вы получите дополнительный аргумент в вашем методе get, и вы можете получить к нему доступ как

class ScheduleView(View):
   form_class = ScheduleForm
   template_name = 'learning_logs/student_schedule.html'

   def get(self, request, pk):
       form = self.form_class(initial={})
       data = StudentSchedule.objects.filter(perm=pk)
       return render(request, self.template_name, {'form': form, 'data': 
data})

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

А также в вашем student_schedule.html вам нужен perm.id для доступа к этому URL как

{% url ...  perm.id%}
...