Django-фильтр с django-таблицей
Я застрял на этой проблеме уже несколько недель и никак не могу решить ее путем самостоятельного исследования.
Сценарий тестирования: У меня есть 4 ученика, которые зарегистрированы в разных группах.
Используя tables2, я создал класс GroupListView(SingleTableView), выбрав группу, я перехожу к классу GroupDetailView(SingleTableView, FilterView).
Это должно показать qs экземпляров LearnerInstances, связанных с этим учеником. Однако при применении f.qs к набору запросов учеников на странице подробностей отображаются все 4 ученика.
views.py
class GroupDetailView(SingleTableView, FilterView):
table_class = LearnerGroupTable
model = LearnerInstance
template_name = "learner/group_detail.html"
filterset_class = LearnerAimFilter
# get all learners within the selected group
def get_queryset(self):
qs = super().get_queryset()
qs = qs.filter(
learner__group__slug=self.kwargs["slug"],
)
return qs # a queryset of learners within the group from model learnerinstance
def get_context_data(self, **kwargs):
context = super(GroupDetailView, self).get_context_data(**kwargs)
learners = self.get_queryset()
context["learners_qs"] = learners
f = LearnerAimFilter(self.request.GET, queryset=learners)
learners = f.qs
context["filter"] = f
context["table"] = LearnerGroupTable(learners)
context["learners"] = learners
context["group"] = Group.objects.filter(slug=self.kwargs["slug"]).values()
context["group_name"] = Group.objects.filter(slug=self.kwargs["slug"]).values(
"short_name"
)
return context
Если я # убираю learners = f.qs, то в детальном представлении отображаются правильные экземпляры учеников, но фильтр не работает. Как только я отменяю #, он показывает всех четырех учеников, но фильтр работает.
filters.py
class LearnerAimFilter(django_filters.FilterSet):
aim = django_filters.ModelChoiceFilter(queryset=Aim.objects.all())
def __init__(self, *args, **kwargs):
queryset = kwargs.pop("queryset", None)
super().__init__(*args, **kwargs)
if queryset:
unique_aims = queryset.values_list("aim", flat=True).distinct()
self.filters["aim"].queryset = Aim.objects.filter(
id__in=unique_aims,
)
class Meta:
model = LearnerInstance
fields = [
"aim",
]
tables.py
class LearnerGroupTable(Table):
class Meta:
model = LearnerInstance
fields = (
"name",
"aim",
"registered",
"start_date",
"end_date",
"achieved",
"pfr_start",
"pfr_end",
)
orderable = True
row_attrs = {
"class": lambda record: (
(
"table-success"
if record.achieved == True and not record.pfrEnd == None
else (
"table-warning"
if record.achieved == True and record.pfrEnd == None
else ""
)
)
)
}
Любой совет будет очень признателен - я не могу продвинуться дальше этой проблемы.