Добавление контекста в Django-проект с представлением на основе классов
У меня проблема с отображением набора запросов определенной модели в моем проекте Gym. Я перепробовал множество различных запросов, но ни один из них не работает
модели:
class Workout(models.Model):
name = models.CharField(max_length = 30,blank=True, null=True)
class Exercise(models.Model):
workout = models.ForeignKey(Workout, on_delete=models.CASCADE, related_name='exercises',blank=True, null=True)
name = models.CharField(max_length = 30, blank=True, null=True)
class Breakdown(models.Model):
exercise = models.ForeignKey(Exercise, on_delete=models.CASCADE, related_name='excercise',blank=True, null=True)
repetitions = models.IntegerField()
Я пытаюсь показать repetitions
в модели Breakdown, которая имеет ForeignKey отношение с Exercise, которое имеет ForeignKey отношение с Workout
views.py
class home(ListView):
model = Workout
template_name = 'my_gym/home.html'
context_object_name = 'workouts'
class workout_details(ListView):
model = Exercise
template_name = 'my_gym/start_workout.html'
context_object_name = 'exercises'
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context['breakdown'] = Exercise.objects.filter(breakdown=self.breakdown)
return context
urls.py
urlpatterns = [
path('', home.as_view(), name='home'),
path('workout/<int:pk>/', workout_details.as_view(), name='workout'),
]
Шаблон:
{% for e in exercises %}
{{ e.name }}
{{ breakdown.repetitions }}
{% endfor %}
Мой вопрос, в чем моя ошибка, которая либо выдает ошибку, либо не показывает требуемый набор данных. Моя цель - выбрать на главной странице тренировку из списка, а на следующей странице должен быть список упражнений с соответствующими повторениями.
get_context_data()
- это метод, рассчитанный на просмотр, а не цикл для использования внутри шаблона или чего-то подобного. Вы установили хорошие отношения, используйте их правильно.
Во-первых, измените related_name
здесь на то, что не будет вызывать путаницы:
class Breakdown(models.Model):
exercise = models.ForeignKey(Exercise, on_delete=models.CASCADE, related_name='breakdowns', blank=True, null=True)
После этого удалите весь get_context_data()
и измените шаблон на:
{% for e in exercises %}
{{ e.name }}
{% for b in e.breakdowns.all %}
{{ b.repetitions }}
{% endfor %}
{% endfor %}