Как выбрать определенный объект из модели django и использовать его для получения url? (CS50 Проект 2)

Я делаю проект CS50 Project 2 и имею модель django под названием Listing, которая имеет объект под названием Category, который пользователь может выбрать с помощью выпадающего списка. Все категории перечислены на странице категорий и должны ссылаться на страницу categories_page, которая отображает все объявления в этой категории. Можете ли вы помочь мне с href и переменной для страницы категорий, чтобы связать ее со страницей categories_page?

categories views.py

def categories(request):
    return render(request, "auctions/categories.html",{
        "Miscellaneous": Listings.objects.all().filter(category=Miscellaneous)
    })

categories.html (Мне нужно связать все категории на этой странице с их собственной страницей categories_page.)

{% block body %}
    <h1>Categories</h1>

    <a href="{% url 'categories' Miscellaneous.category %}" style = "color: rgb(58, 58, 58);"><h5>Miscellaneous</h5></a>
    <h5>Movies and Television</h5>
    <h5>Sports</h5>
    <h5>Arts and Crafts</h5>
    <h5>Clothing</h5>
    <h5>Books</h5>
{% endblock %}

categories_page views.py

def categories_page(request, category):
    listings = Listings.objects.all().filter(category=category)
    return render(request, "auctions/categories_page.html",{
        "listings": listings,
        "heading": category
    })

categories_page.html

{% block body %}
    <h1>{{ heading }}</h1>
    {% for listing in listings %}
        <a href="{% url 'listing' listing.id %}" style = "color: rgb(58, 58, 58);">
            <img src ="{{ listing.image }}" style = "height: 10%; width: 10%;">
            <h4 class = "text">{{ listing.title }}</h4>
            <h6>Description: {{ listing.description }}</h6>
            <h6>Category: {{ listing.category }}</h6> 
            <h6>Price: ${{ listing.bid }}</h6>
        </a>
    {% endfor %}

{% endblock %

представления и html страницы категорий работают. У меня проблемы с представлениями категорий и html.

Дайте мне знать, если вам нужен еще какой-либо код. Большое спасибо!

urls.py

from django.urls import path
from .models import User, Listings
from .forms import ListingsForm
from . import views

urlpatterns = [
    path("", views.index, name="index"),
    path("login", views.login_view, name="login"),
    path("logout", views.logout_view, name="logout"),
    path("create", views.create, name="create"),
    path("watchlist", views.watchlist, name="watchlist"),
    path("categories", views.categories, name = "categories"),
    path("categories/<str:category>/", views.categories_page, name = "categories_page"),
    path("listing/<int:id>/", views.listing, name = "listing"),
    path("register", views.register, name="register")
]

При использовании тега шаблона, {% url %} первым параметром является имя пути, затем следуют любые параметры. Я думаю, это одна проблема. Вторая заключается в том, что для доступа к отдельным объектам необходимо итерировать набор запросов, как это сделано в categories_page.html, но не в categories.html.

Именование может запутать, например, у вас есть путь categories с именем categories и названием categories, а затем для страницы, на которую вы пытаетесь сослаться, у вас есть categories/<str:category>/, другими словами, другой путь категории, на этот раз с аргументами, который соответствует category_page и имеет название categories_page. Но в вашем шаблоне categories.html у вас есть строка

<a href="{% url 'categories' Miscellaneous.category %}" style = "color: rgb(58, 58, 58);"><h5>Miscellaneous</h5></a>

Эта строка ищет name categories, что соответствует views.category, что, как я полагаю, не то, что вам нужно. Кроме того, Miscellaneous является кверисетом, поэтому вам нужно выполнять итерации над ним, но вы обращаетесь с ним так, как будто это один объект. Возможно, это можно исправить, сделав следующее в вашем файле categories.html:

{% block body %}
    <h1>Categories</h1>
    
    {% for cat in Miscellaneous %}
    <a href="{% url 'categories_page' cat.category %}" style = "color: rgb(58, 58, 58);"><h5>Miscellaneous</h5></a>
    {% endfor %}

    <h5>Movies and Television</h5>
    <h5>Sports</h5>
    <h5>Arts and Crafts</h5>
    <h5>Clothing</h5>
    <h5>Books</h5>
{% endblock %}

На самом деле нет необходимости пытаться получить объект категории из модели. Этот код сработал для меня.

category.views

def categories(request):
    return render(request, "auctions/categories.html")

categories.html

<a href="{% url 'categories_page' 'Miscellaneous' %}" style = "color: rgb(58, 58, 58);"><h5>Miscellaneous</h5></a>
    <a href="{% url 'categories_page' 'Movies and Television' %}" style = "color: rgb(58, 58, 58);"><h5>Movies and Television</h5></a>
    <a href="{% url 'categories_page' 'Sports' %}" style = "color: rgb(58, 58, 58);"><h5>Sports</h5></a>
    <a href="{% url 'categories_page' 'Arts and Crafts' %}" style = "color: rgb(58, 58, 58);"><h5>Arts and Crafts</h5></a>
    <a href="{% url 'categories_page' 'Clothing' %}" style = "color: rgb(58, 58, 58);"><h5>Clothing</h5></a>
    <a href="{% url 'categories_page' 'Books' %}" style = "color: rgb(58, 58, 58);"><h5>Books</h5></a>

Все, что вам нужно сделать, это поместить имя url, а затем имя аргумента, который вы хотите.

Вернуться на верх