Hello! I am trying to create a course web app.
We have courses > modules > videos
On the view course page, i have set the sidebar like this: (in order to have a dropdown with video links that belong to a module)
{% for module in modules %}
{% if module.module_videos.count == 0 %}
{% else %}
Module name is: {{module.name}} <br>
Number of lessons in this module:
{{module.module_videos.count}} <br>
{% for video in module.module_videos.all %}
<a href="{{video.get_absolute_url}}">{{video.title}}</a><br>
{% endfor %}
{% endif %}
{% endfor %}
Now when single video (lesson) is opened, i would like to have the Next button and Previous show somewhere on the page.
Can you please help me do that?
Here is the model file
from django.db import models
from django.urls import reverse
class Course(models.Model):
name = models.CharField(max_length=100, unique=True)
slug = models.SlugField(max_length=100, unique=True, blank=True, null=True)
image = models.ImageField(upload_to='course/thumbnails')
def __str__(self):
return self.name
def get_absolute_url(self):
return reverse('courses:course', args=[str(self.slug)])
def clean(self):
self.name = self.name.capitalize()
self.slug = self.slug.lower()
class Module(models.Model):
name = models.CharField(max_length=100, default='Module name', unique=True)
course = models.ForeignKey(Course, on_delete=models.CASCADE, related_name='modules')
def __str__(self):
return self.name
def clean(self):
self.name = self.name.capitalize()
class Video(models.Model):
title = models.CharField(max_length=100, unique=True)
slug = models.SlugField(max_length=100, unique=True)
description = models.TextField(blank=True, null=True)
course = models.ForeignKey(Course, on_delete=models.CASCADE, related_name='videos')
module = models.ForeignKey(Module, on_delete=models.CASCADE, related_name='module_videos')
vimeo_id = models.CharField(max_length=50)
# for next video
order = models.IntegerField(default=1)
def __str__(self):
return self.title
def get_absolute_url(self):
return reverse('courses:video', args=[str(self.course.slug), str(self.slug)])
def clean(self):
self.title = self.title.capitalize()
self.slug = self.slug.lower()
class Meta:
ordering = ['order']
Here are the views
from django.shortcuts import render
from .models import Course, Module, Video
from django.contrib.auth.decorators import login_required
def courses_list(request):
courses = Course.objects.all()
context = {'courses': courses}
return render(request, 'courses/courses-list.html', context)
# stranica kursa
def course(request, course_slug):
course = Course.objects.get(slug=course_slug)
modules = Module.objects.filter(course=course)
context = {
'course': course,
'modules': modules,
}
return render(request, 'courses/view-course.html', context)
@login_required
def video(request, course_slug, video_slug):
video = Video.objects.get(slug=video_slug)
next_video = Video.objects.filter(order__gt=video).order_by('order').first()
context = {
'video': video,
'next_video': next_video
}
return render(request, 'courses/video.html', context)
As you can see, i tried something with next_video but i get the error immediately:
TypeError at /courses/course1/course-name/
Field āorderā expected a number but got <Video: Introduction Lesson>.
Hope somebody can give me an advice, thank you!