user12474605
user12474605

Reputation:

Python Django Linking URLS

I am working on an online school project, I just linked subjects, with classes so when you click on a class you get it's subjects page, and in the subject page there are lessons(lessons use IDs not slugs), My problem is at linking the lesson URL in the HTML page

so my question is How to link lessons to materials(subjects) in the HTML page?

My codes:

HTML PAGE:

<!DOCTYPE html>
<html>
    <head>    
        <meta charset="utf-8">
        <title>Name</title>
        <link rel="stylesheet" href="/static/css/style.css">
    </head>
    <body>
        <div>
            <nav>
                <div class="logo"><img src="/static/images/Logo.png" width=50px></div>
                <ul class="navul">
                    <li class="navli"><a class="nava" href="404.html">حول الموقع</a></li>
                    <li class="navli"><a class="nava" href="404.html">المكتبة</a></li>
                    <li class="navli"><a class="nava" href="404.html">الدورات</a></li>
                    <li class="navli"><a class="nava" href="/classes">الصفوف</a></li>
                    <li class="navli"><a class="nava" href="/">الصفحة الرئيسية</a></li>


                </ul>
            </nav>

            <div class="div1">
                <img src="/static/images/Logo.png" width="90" class="logo2">
                <h1 class="t1">المواد </h1>
            </div>

            <div class="cardrow">
                {% for material in material.all %}

                <div class="cardcolumn">

            {% for Lesson in Materials.vedio_set.all %}
            <a href="{% url 'vedio' lesson.id %}" > lesson1</a>
            {% endfor %}


                    <div class="card">
                    <img class="imgcls" src="{{ material.image.url }}">
                    <h1>{{ material.title }}</h1>
                    </div>
                    </a>
                   {% endfor %} 
                </div>              
            </div>
        </div>
    </body>
</html>

MODELS.py:

from django.db import models
from users.models import *


# Create your models here.
class Class(models.Model):
    image= models.ImageField(upload_to="images")
    name= models.CharField(max_length=200, default=1)
    title= models.CharField(max_length=200)

    def __str__(self):
        return self.title

class Material(models.Model):
    name= models.CharField(max_length=200, default=1)
    title= models.CharField(max_length=200)
    classes= models.ForeignKey(Class, default=1, on_delete=models.SET_DEFAULT)

    def __str__(self):
        return self.name
class Lesson(models.Model):
    slug=models.SlugField()
    video=models.FileField(upload_to="videos", default="")
    title=models.CharField(max_length=200)
    description=models.TextField()
    thumbnail=models.ImageField(upload_to="images")
    Material=models.ForeignKey(Material, default=1, on_delete=models.SET_DEFAULT)
    allowed_membrship=models.ManyToManyField(Membership)
    def __str__(self):
        return self.title

VIWES.py:

from django.shortcuts import render, get_object_or_404
from .models import Class, Material, Lesson
# Create your views here.


def home(request):
    Classes= Class.objects
    return render(request, 'classes/index.html', {"class":Classes})

def classes(request):
    Classes= Class.objects
    return render(request, 'classes/Classes.html', {"class":Classes})

def materials(request, classes_id):
    theclass= get_object_or_404(Class, pk=classes_id)
    Materials = Material.objects.all()
    context = {
        'classes': theclass,
        'material': Materials
    }
    return render(request, 'classes/Materials.html', context)


def vedio(request, lesson_id):
    theMaterial=get_object_or_404(Material, pk=lesson_id)
    theLesson=Lessons.objects.all
    context={
        'Material': theMaterial,
        'Lesson':theLesson
    }
return render(request, 'classes/Lesson.html', context)

URLS:

 from django.contrib import admin
    from django.urls import path
    import classrooms.views
    import users.views
    from django.conf import settings
    from django.conf.urls.static import static

    urlpatterns = [
        path('admin/', admin.site.urls),
        path('', classrooms.views.home),
        path('classes', classrooms.views.classes),
        path('classes/<int:classes_id>', classrooms.views.materials, name="material"),
        path('signup', users.views.signup, name="signup"),
        path('login', users.views.login, name="login"),
        path('logout', users.views.logout, name="logout"),
        path('class/<int:classes_id>/<int:lessson_id>', classrooms.views.vedio, name="lessons")
    ]

    urlpatterns += static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
    urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

I think I got some typical errors, sorry

Membership is in another app, I don't think you need it. this is it, Hope Understand me Well, thank you

Upvotes: 0

Views: 44

Answers (1)

jmunsch
jmunsch

Reputation: 24089

Based on what is happening here:

def materials(request, classes_id):
    theclass= get_object_or_404(Class, pk=classes_id)
    Materials = Material.objects.all()
    context = {
        'classes': theclass,
        'material': Materials
    }
    return render(request, 'classes/Materials.html', context)

In Materials.html you can reverse access via Material.lesson_set.all():

<p> classes_id: {{ classes.id }} <p>

{% for lesson in material.lesson_set.all() %}
    <p><a href="{% url 'lessons' classes.id lesson.id %}">{{ lesson.title }}</a></p>
    <p>
        <a href="{{ lesson.file.url }}">{{ lesson.file.url }}</a>
        {{ lesson.description }}
    </p>
{% endfor %}

Also look into:

Some of the variables are really confusing with mixed capitalization.

Upvotes: 1

Related Questions