Перенаправление из ListView в другой ListView в Django 2.1

#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 %} ? На самом деле у меня нет никакого соответствия для предложений :/