Django:如何将模型从tempalte渲染到另一个?

发布于 2025-02-10 13:27:08 字数 2718 浏览 1 评论 0原文

我有一个应用程序正在尝试在其中使用模块的课程,在课程页面内,我想将页面与其中的模块链接在一起 id'。

位置参数:

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)    

'

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()
    })

modules_page

    path("", views.index, name="index"),
    path("auction/course/<str:id>", views.course, name="course"),
    path("modules", views.modules_page, name="modules_page"), 

)缺少1所需的

<!-- 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 %}

I have an app were I'm trying to make a course with modules in it, and inside the course page I want to link a page with the modules of the course in it but I get "TypeError at /modules
modules_page() missing 1 required positional argument: 'id'".

Sorry for my bad explaining. I appreciate every answer, thanks in advance!

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 %}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

戏舞 2025-02-17 13:27:08

第一件事,而不是从模块函数中渲染登​​录页面,请使用login_required Decorator,请遵循

from django.contrib.auth.decorators import login_required
@login_required
def modules_page(request, id):
    # your code here

您的模块函数期望课程ID

看起来像这样

path("modules/<int:id>/", views.modules_page, name="modules_page"), 

您的URL模式在课程列表页面中 ;在您每门课程的for循环部分中;模块页面的链接标签应该是

<a href={% url 'modules_page' id=course.id %}>Module Link</a>

First thing instead of rendering login page from module function use login_required decorator from as follow

from django.contrib.auth.decorators import login_required
@login_required
def modules_page(request, id):
    # your code here

Your module function expects course id

your url patterns should look like this

path("modules/<int:id>/", views.modules_page, name="modules_page"), 

In course list page; In the for loop section where you are getting each course; The link tag that takes to module page should be

<a href={% url 'modules_page' id=course.id %}>Module Link</a>
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文