Появление некорректного контекста в проекте 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)