Как выбрать определенный объект из модели 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, а затем имя аргумента, который вы хотите.