Открыть listView с иностранным ключом из другого listview с помощью Django

Я работаю над страницей обзора товара на Django. Для этого у меня есть три модели: категория, бренд, продукт. Я создал представление с ListView для категорий. Я перебираю их для отображения. Затем я хочу открыть еще один обзор всех брендов в этой категории. Как мне это сделать?

Вот мои модели:

    class Category(models.Model):
        category_name = models.CharField(max_length=200)
        sub_category = models.CharField(max_length=200,blank=True,null=True)
        category_picture = models.ImageField(upload_to='category/', null=True, blank=True)
    
        def __str__(self):
            if self.sub_category is None:
                return self.category_name
            else:
                return f" {self.category_name} {self.sub_category}"
    
        class Meta:
            ordering = ['category_name']
    
    class Brand(models.Model):
        category = models.ForeignKey('Category', on_delete=models.SET_NULL,null=True,blank=True)
        brand_name = models.CharField(max_length=200)
        brand_owner = models.CharField(max_length=200)
        brand_story = models.TextField()
        brand_country = models.CharField(max_length=200)
    
        def __str__(self):
            return f"{self.brand_name}"
        
    
class Bottle(models.Model):
    category_name = models.ForeignKey('Category', on_delete=models.SET_NULL,null=True,blank=True)
    brand = models.ForeignKey('Brand', on_delete=models.CASCADE)
    bottle_name = models.CharField(max_length=255)
    bottle_info = models.TextField()
    bottle_tasting_notes = models.TextField()
    bottle_barcode = models.IntegerField()
    bottle_image = models.ImageField(upload_to='bottles/',null=True)

    def __str__(self):
        return f"{self.brand.brand_name} {self.bottle_name}"

Как открыть просмотр списка всех брендов в определенной категории по ссылке просмотра списка категории? Спасибо.

Первое, что нужно сделать, это создать еще один listview, который отображает все бренды в определенной категории. Для этого мы создадим новый метод get_queryset().

views.py

class BrandListView(ListView):
    model = Brand
    def get_queryset(self):
        return Brand.objects.filter(category__category_name=self.kwargs['category'])

Далее добавьте url в ваш URLS.py, чтобы к нему можно было получить доступ. Мы используем имя_категории в качестве части url, чтобы он был читабельным для человека

from .views import BrandListView

urlpatterns = [
    path('brands/<str:category>/', PublisherBookList.as_view()), name= "brand_list"
]

Затем, когда вы перебираете категории в своем шаблоне, создайте ссылку на url

{% for category in categories %}
{{category.category_name}} : <a href="{% url 'brand_list' category.category_name %}">See brands in category</a>
{% endfor %}

Это будет работать до тех пор, пока ваши категории имеют достаточно простые названия. В противном случае вы можете использовать ID в URL, или добавить поле slug в модель и использовать его.

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