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