Как я могу нажать на любую из категорий в списке и быть перенаправленным на все активные объявления в этой категории? Django
Яm working on a django project (iновичок) и я сделал html страницу, отображающую список доступных категорий. Я хочу сделать каждую из них ссылкой и когда пользователь нажимает на нее, он должен быть перенаправлен на список активных объявлений, основанных на этой категории. Я просто не могу понять, как это сделать.
Вот мой код:
models.py
class Category(models.Model):
category = models.CharField(max_length=64)
def __str__(self):
return self.category
class Listings(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE, null=True, blank=True)
title = models.CharField(max_length=128)
description = models.CharField(max_length=822)
price = models.FloatField()
sold = models.BooleanField(default=False)
category = models.ForeignKey(Category, on_delete=models.CASCADE,blank=True, null=True,
related_name="listings_category")
categories = models.ManyToManyField(Category, blank=True, related_name="select_category")
image_url = models.CharField(max_length=128,blank=True, null=True)
def __str__(self):
return f"{self.title}"
urls.py
path('category/', views.category, name="category"),
path("listing/<str:listing_id>", views.listing, name="listing")
views.py
def category(request):
cat = Category.objects.filter().values('category')
category_id = Category.objects.filter().values('id')
z = []
for c in category_id:
z.append(c['id'])
listing = Listings.objects.filter(category__in= z)
categories = Category.objects.all()
category = Category.objects.filter(id__in=z)
print(category)
return render(request, "auctions/category.html",{
"categories":categories,
"category":category,
"listing":listing
})
def listing(request, listing_id):
listing = Listings.objects.get(id=listing_id)
user = request.user
owner = True if listing.user == user else False
category = Category.objects.get(category=listing.category)
comments = Comments.objects.filter(listing=listing.id)
watching = WatchList.objects.filter(user = user, listing = listing)
if request.method == "POST":
comment = request.POST["comment"]
if comment != '':
Comments.objects.create(user=user, listing=listing, comment=comment)
return HttpResponseRedirect(listing_id)
return render(request, "auctions/listing.html", {
"listing": listing,
"category": category,
"owner": owner,
"comments": comments,
"watching": WatchList.objects.filter(user = user, listing =
listing).values('watching'),
})
HTML
{% block body %}
{% for cat in category %}
<ul>
<li>
<a href="">{{ cat.category }}</a>
</li>
</ul>
{% endfor %}
{% endblock %}
Ive got the link (Category) to render the html page with the list of available categories but I cant link them to their respective active listings from the database.
Любая помощь будет очень признательна.
Вам нужно добавить url для списка объявлений, а затем представление, которое его обрабатывает, а также шаблон.
в urls.py:
path('category/<int:category_id>', views.listing_list, name="listing_list"),
в views.py (не забудьте задать имя шаблона в вызове рендеринга):
def listing_list(request, category_id):
from django.shortcuts import get_object_or_404
category = get_object_or_404(Category, pk=category_id)
# use a reverse lookup on listings_category foreign key name
listings = category.listings_category.all()
return render(request, "auctions/<template name goes here>.html",{
"category":category,
"listings":listings
})
В вашем шаблоне будет объект категории, а также все объявления, принадлежащие ей в контексте.
Затем в вашем auctions/category.html вам нужно будет изменить ваш HTML:
{% block body %}
{% for cat in category %}
<ul>
<li>
<a href="{% url 'listing_list' category_id=category.pk %}">{{ cat.category }}</a>
</li>
</ul>
{% endfor %}
{% endblock %}