#python #django
#python #django
Вопрос:
Я некоторое время борюсь с одной проблемой. Я хотел бы использовать веб-сайт следующим образом. Домашняя страница со ссылками на категории -> Когда я перейду к категориям, я бы перечислил все предложения с этими основными категориями. Но также для данной категории я хотел бы иметь возможность фильтровать эти категории по подкатегориям. На данный момент я борюсь с шагом номер один. Вот мой код.
class HomeView(ListView):
context_object_name = 'category'
queryset = Category.objects.all()
template_name = 'accounts/home.html'
class GetOffersByCategory(ListView):
model = Offer
template_name = 'offer/offer_list.html'
context_object_name="category"
def get_queryset(self):
self.category = get_object_or_404(Category, name=self.kwargs['category'])
return Offer.objects.filter(category=self.category)
И мои URL-адреса
path('', views.HomeView.as_view() ,name='home'),
path('offers/<category>',views.GetOffersByCategory.as_view(),name='offers'),
И мои модели.
class Offer(models.Model):
title = models.CharField(max_length=100)
content = models.TextField(blank=False)
price = models.IntegerField()
contact = models.IntegerField()
photo = models.ImageField(upload_to='offer_images/',blank=True)
created_at = models.DateTimeField(auto_now_add=True)
category = models.ForeignKey('Category', null=True, blank=True,on_delete=models.CASCADE)
slug = models.SlugField(max_length=200, db_index=True,default="None")
def get_absolute_url(self):
return reverse('offers:offer_detail',args=[self.title, self.slug])
class Meta:
ordering = ('title',)
index_together = (('id', 'slug'),)
def __str__(self):
return self.title
class Category(models.Model):
name = models.CharField(max_length=200)
slug = models.SlugField()
parent = models.ForeignKey('self',blank=True, null=True ,related_name='children',on_delete=models.CASCADE)
class Meta:
unique_together = ('slug', 'parent',)
verbose_name_plural = "categories"
def __str__(self):
full_path = [self.name]
k = self.parent
while k is not None:
full_path.append(k.name)
k = k.parent
return ' -> '.join(full_path[::-1])
def get_absolute_url(self):
return "/offers/%s/" % self.slug
Основная проблема для меня — работать с URL-адресами в шаблонах. Потому что я понимаю эти более простые шаблоны, такие как { url ‘name’}, но я не знаю точно, как создать ссылку типа {% ‘category:’MyCategoryFromDB’ %}. Я не хочу проходить через цикл for, потому что я знаю свои категории.
Я надеюсь, что объяснение моей проблемы правильное, и она будет решена с вашей помощью 🙂
Комментарии:
1. Не могли бы вы поделиться моделями для категории и предложить, пожалуйста?
2. Я полагаю,
self.publisher
должно бытьself.category
? В вашем шаблоне{% url 'offers' category=category.name %}
будет корректно изменен URL-адрес, предполагая, что вы перебираете свои категории и у вас естьcategory
объект.3. и
context_object_name
не должно быть «category» для моделиOffer
, это должно быть «offer_list» (в вашем шаблоне это сбивало бы с толку, поскольку это список предложений). По идееHomeView
, это должно бытьcategory_list
.4. Что ж, после ваших советов я получил ошибку следующего содержания «Обратное для ‘предложения’ не найдено «.
Ответ №1:
Вы можете попробовать подобное в accounts/home.html
:
{% for category in object_list %}
{% url 'offers' category.name %}
{% endfor %}
Комментарии:
1. он использует название категории, поэтому оно должно быть
{% url 'offers' category=category.name %}
2. Итак, если я хочу перейти в категорию ‘Terraristic’, тогда я должен ввести {% url ‘offers’ category=Terraristic %} ? На самом деле у меня нет никакого соответствия для предложений :/