首页 > 解决方案 > 如何通过 ModelChoiceField 选择动态过滤视图

问题描述

我创建了一个呈现学生下拉列表的模板。

我想过滤另一个视图上的查询集,以仅显示所选学生的日程信息。

student_list 中的 perm_id 是主键, StudentSchedule 中的 perm 是外键。

这是我的 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)

表格.py

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

视图.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})

我可以执行以下操作并获得 id #123456 的学生

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

但是,我希望 Django 使用从 StudentList 中选择的学生的 perm_id

我的网址如下:

# 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'),

标签: djangofiltermodelchoicefield

解决方案


说你的路径就像

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%}

推荐阅读