Открыть 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 в модель и использовать его.