Появление некорректного контекста в проекте Django

Я создаю проект тренировки, где для каждой тренировки есть список упражнений и для каждого упражнения есть список сетов, которые имеют определенные веса и повторения.

Вот модель для большей ясности:


class Workout(models.Model):
    name = models.CharField(max_length = 30,blank=True, null=True)
    date = models.DateField(blank=True, null=True)

    def __str__(self):
        return str(self.date) + ' ' + self.name


class Exercise(models.Model):
    training = models.ForeignKey(Workout, on_delete=models.CASCADE, related_name='exercises',blank=True, null=True)
    name = models.CharField(max_length = 30, blank=True, null=True)

    def __str__(self):
        return self.name

class Set(models.Model):
    exercise = models.ForeignKey(Exercise, on_delete=models.CASCADE, related_name='sets',blank=True, null=True)
    weight = models.FloatField(validators=[MinValueValidator(0)],blank=True, null=True)
    repetitions = models.IntegerField(validators=[MinValueValidator(1)],blank=True, null=True)
    order = models.IntegerField(validators=[MinValueValidator(1)],blank=True, null=True)

    def __str__(self):
        return self.exercise.name + ' set #' + str(self.order)

Я пытаюсь показать список повторений в каждом сете для определенного упражнения на странице шаблона, но я продолжаю получать ошибки, такие как:

activity() missing 1 required positional argument: 'request'

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

Вот мнения:

def activity(self,request, **kwargs):
    template_name = 'my_gym/start_workout.html'
    excercises = Exercise.objects.all().order_by('id')
    sets = Set.objects.filter(
            set=self.object).order_by('id')

    context = {
        'excercises': excercises,
        'sets': sets,
    }
    return render(request, template_name, context)

Я также пробовал:

def activity(request):
    template_name = 'my_gym/start_workout.html'
    excercises = Exercise.objects.all().order_by('id')
    sets = Set.objects.all().order_by('id')

    context = {
        'excercises': excercises,
        'sets': sets,
    }
    return render(request, template_name, context)

Вот шаблон:

{% for set in sets %}
<td>{{set.order}}</td>
<td>{{set.repetitions}}</td>
{% endfor %}

Мой вопрос в том, как показать сеты только для выбранного упражнения.

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

Спасибо

Как я сделал в своем проекте (это был блог):

В urls.py я создал новую страницу с category_id(=Category primary key) следующим образом:

path('category/<int:category_id>/', get_category, name='category')

Теперь в функции get_category я получаю дополнительный параметр, который означает pk категорию, к которой он принадлежит. А в views.py:

def get_category(request, category_id):
    records = Recordings.objects.filter(category=category_id)
    category = Category.objects.get(pk=category_id)
    context = {
        'records': records,
        'category': category,
        'title': category.title,
    }
    return render(request=request, template_name='blog/category.html', context=context)

Я просто отфильтровал их по category.pk и все работает нормально. В вашем случае Запись = Набор, Категория = Упражнение, category_id = exercise_id

Если вы используете другой способ создания страниц для упражнений - пожалуйста, прокомментируйте, будет интересно найти решение для такой модели

P.S. Это ранняя версия моего проекта, для оптимизации запроса следует использовать select_related P.P.S Оптимизированная версия вида + урлы

# urls.py
path('category/<int:category_id>/', RecordingsByCategory.as_view(), name='category')

# views.py
class RecordingsByCategory(ListView):
    model = Recordings
    template_name = 'blog/category.html'
    context_object_name = 'records'

    def get_context_data(self, *, object_list=None, **kwargs):
        context = super().get_context_data(**kwargs)
        context['title'] = Category.objects.get(pk=self.kwargs['category_id'])
        return context

    def get_queryset(self):
        # kwargs goes from urls.py
        return Recordings.objects.select_related('category').filter(category=self.kwargs['category_id'], is_published=True)
Вернуться на верх