Django: Как перевести модель из одного темпалта в другой?
У меня есть приложение, в котором я пытаюсь сделать курс с модулями, и внутри страницы курса я хочу связать страницу с модулями курса, но получаю "TypeError at /modules modules_page() missing 1 required positional argument: 'id'".
Извините за плохое объяснение. Я ценю каждый ответ, спасибо заранее!
Models.py
class Course(models.Model):
title = models.CharField(max_length=30)
description = models.TextField(null=True, max_length=150)
#completion_time = models.CharField(max_length=30)
course_image = models.ImageField(blank=True, null=True, upload_to="images/")
watching = models.ManyToManyField(User, blank=True, related_name="watchlist")
category = models.ForeignKey(Category, on_delete=models.CASCADE ,related_name="listing_category")
author = models.ForeignKey(User, on_delete=models.PROTECT, related_name="author")
ended = models.BooleanField(default=False)
creation_date = models.DateTimeField(default=timezone.now)
class Module(models.Model):
title = models.CharField(max_length=255, null=True)
description = models.TextField(blank=True, max_length=2550, null=True)
module_image = models.ImageField(blank=True, null=True, upload_to="images/")
creation_date = models.DateTimeField(default=timezone.now)
module_author = models.ForeignKey(User, on_delete=models.PROTECT, related_name="module_author")
deadlined = models.BooleanField(default=False)
course = models.ForeignKey(Course, on_delete=models.CASCADE, related_name="modules", null=True)
Views.py
def courses_page(request):
courses = Course.objects.all()
return render(request, "auctions/index.html", {
"courses": courses
})
# THIS FUNCTION IS NOT WORKING
def modules_page(request, id):
if not request.user.is_authenticated:
return render(request, "auctions/login.html")
course = Course.objects.get(id=id)
ended = Course.ended
return render(request, "auctions/modules_page.html", {
"course": course,
"course_ended": "Course has ended.",
"commentform": CommentForm()
})
Urls.py
path("", views.index, name="index"),
path("auction/course/<str:id>", views.course, name="course"),
path("modules", views.modules_page, name="modules_page"),
Template.html:
<!-- Modules -->
<h3><span class="badge badge-secondary badge-pill mx-1">{{ course.modules.count }}</span><a href="{% url 'modules_page' course.id %}">Modules:</a></h3>
{% for module in course.modules.all %}
<div class="card p-1 m-2 col-lg-12 col-sm-12">
<div class="card-body">
<h4 class="card-title"><a href="{% url 'module' module.id %}">{{ module.title }}</a></h4>
<h6 class="card-subtitle mb-2 text-muted">{{ module.creation_date }}</h6>
<ul>
<h6>{{ module.description }}</h6>
{% endfor %}
Во-первых, вместо вывода страницы входа из функции модуля используйте декоратор login_required из следующего
документаfrom django.contrib.auth.decorators import login_required
@login_required
def modules_page(request, id):
# your code here
Функция вашего модуля ожидает идентификатор курса
ваши шаблоны url должны выглядеть следующим образом
path("modules/<int:id>/", views.modules_page, name="modules_page"),
На странице списка курсов; В секции цикла for, где вы получаете каждый курс; Тег ссылки, который ведет на страницу модуля, должен быть
<a href={% url 'modules_page' id=course.id %}>Module Link</a>