Django_filters.Filterset с контекстными данными из FilterView

У меня есть модель LearnerInstance:

class LearnerInstance(models.Model):
    learner = models.ForeignKey(Learner, on_delete=models.CASCADE)
    aim = models.ForeignKey(Aim, on_delete=models.CASCADE)
    ...

    class Meta:
        unique_together = ("learner", "aim")

    def __int__(self):
        return self.learner

    def name(self):
        return f"{self.learner.firstname} {self.learner.surname}"

views.py

class GroupDetailView(FilterView):
    model = LearnerInstance
    template_name = "group_detail.html"
    table = LearnerGroupTable
    filterset_class = LearnerInstanceFilter

    def get_context_data(self, **kwargs):
        context = super(GroupDetailView, self).get_context_data(**kwargs)
        queryset = LearnerInstance.objects.filter(
            learner__group__short_name=self.kwargs["pk"])
        f = LearnerInstanceFilter(
            self.request.GET, queryset=queryset.filter(aim=self.request.GET.get("aim")))
        context["table"] = LearnerGroupTable(f.queryset)
        context["group"] = Group.objects.filter(short_name=self.kwargs["pk"]).values()
        return super().get_context_data(**context)

filters.py

class LearnerInstanceFilter(django_filters.FilterSet):

    class Meta:
        model = LearnerInstance
        fields = ["aim"]

Вопрос: Как изменить фильтр, чтобы в get_context_data отображались только отдельные варианты цели, возвращаемые набором запросов (все экземпляры учеников, относящиеся к выбранной группе)?

База данных содержит все возможные цели, которые предлагаются через фильтр (я знаю, что это связано с тем, что фильтр связан с моделью и полем цели), я хочу, чтобы мне был представлен только список целей, которые являются уникальными для учащихся в текущем контексте.

На мой взгляд, чтобы изменить фильтр таким образом, чтобы он показывал только отдельные aim варианты, связанные с текущим контекстом, вам нужно переопределить queryset фильтра и настроить свой get_context_data метод для достижения этой цели:

views.py

from django_filters import rest_framework as filters

class GroupDetailView(FilterView):
    model = LearnerInstance
    template_name = "group_detail.html"
    table = LearnerGroupTable
    filterset_class = LearnerInstanceFilter

    def get_context_data(self, **kwargs):
        context = super(GroupDetailView, self).get_context_data(**kwargs)

        queryset = LearnerInstance.objects.filter(
            learner__group__short_name=self.kwargs["pk"]
        )

        unique_aims = queryset.values_list('aim', flat=True).distinct()

        f = LearnerInstanceFilter(
            self.request.GET,
            queryset=queryset.filter(aim__in=unique_aims)
        )

        context["table"] = LearnerGroupTable(f.qs)
        context["group"] = Group.objects.filter(short_name=self.kwargs["pk"]).values()
        context["filter"] = f  # Include the filter in the context if needed for rendering

        return context
Вернуться на верх