Тренажёр работал только по одной теме, а повторять хочется и «по всем сразу». Решил дать выбор: отметить несколько тем. Пока разбирался с чекбоксами в форме и сбором выбранных id — понял деталь про то, что в POST приходят только отмеченные. Маленькая, но показательная логика.

Нейтрально: чекбоксы в HTML при выборе отправляют свои значения; сервер фильтрует по переданным id.

selected = request.POST.getlist("topics")   # ["3","5"] отмеченные
# в GET-пути: /flashcards/?topics=3&topics=5
if selected:
    cards = Card.objects.filter(topic_id__in=selected)

Радость от «гибкого выбора» — тренажёр становится таким, как мне удобно, а не как «придумано». Каждая такая мелочь — кирпич в уверенность: я проектирую UX, а не только пишу эндпоинты.