Django-filter with django-table
I've been stuck on this problem for a couple of weeks and can't seem to resolve it through self research.
Scenario for testing: I have a 4 learners who are registered against different groups.
Using tables2 I've created class GroupListView(SingleTableView), selecting the group takes me to class GroupDetailView(SingleTableView, FilterView).
This should show a qs of LearnerInstances associated with that learner. However, when applying the f.qs to the learner queryset it shows all 4 learners on the detail page.
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
If I # out the learners = f.qs the detail view shows the correct learner instances but does not filter. As soon as I undo the # it then shows all four learners but the filter works.
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 ""
)
)
)
}
Any advice would be very much appreciated - I can't progress beyond this problem.
