Estoy tratando de devolver una lista de categorías para una empresa, y para cada categoría me gustaría enumerar todos los elementos relacionados con la categoría.
Estaba devolviendo todos mis artículos, no por categoría, pero he decidido que los quiero ordenados por categoría. Esto es lo que he intentado (entre otros intentos también) simplemente tengo problemas para colocar los elementos en sus categorías. Este es mi último intento
En mi models.py tengo
Business(models.Model): name = models.CharField(max_length=100) address = models.CharField(max_length=100) logo = models.CharField(max_length=300) ItemCategory(models.Model): name = models.CharField(max_length=50) Item(models.Model): name = models.CharField(max_length=100) business = models.ForeignKey(Business) category = models.ForeignKey(ItemCategory) short_description = models.CharField(max_length=250)en mis vistas.py
def business_profile(request, business_id): items = Item.objects.filter(business_id = business_id).select_related('itemcategory') return render(request, 'business_profile.html', {"items": items})en mi plantilla estoy intentando
{% for itemcategory in items.itemcategory_set.all %} {{ itemcategory.name }} {% for item in itemcategory %} {{ item.name }} <br> {{ item.short_description }} {% endfor %} {% endfor %}A partir de mi investigación sobre otras preguntas y la lectura de los documentos, sentí que esto sería correcto. Sin embargo, a partir de mis resultados, no puedo obtener el resultado correcto en mi plantilla.
categories = ItemCategory.objects.filter(business = business_id)
y luego posiblemente agregar un select_related('item') para procesar todos los elementos de la categoría?
ACTUALIZACIÓN: respondí a continuación en un comentario con una explicación.
Para enumerar los artículos por categoría, usé la idea de @yusuf.oguntola e inicialmente obtuve el negocio con .get(), luego creé un conjunto de consultas para obtener todos los artículos. Mi función en views.py incluida
business = Business.objects.get(id = business_id) items = business.item_set.all().order_by('category')nota: el business_id se pasó en el patrón de URL
Sin embargo, el cambio clave estuvo en mi plantilla. Encontré esta increíble funcionalidad integrada para plantillas en los documentos de django aquí
Lo implementé en la plantilla así...
{% regroup items by category as category_list %} <ul> {% for category in category_list %} <li>{{ category.grouper }} <ul> {% for item in category.list %} <li>{{ item.name }}<br> {{ item.short_description }}</li> {% endfor %} </ul> </li> {% endfor %} </ul>Una de las partes más importantes es que debe tener order_by() y poner el parámetro del campo por el que está ordenando, en mi caso, categoría. Si esto no está incluido, simplemente colocará los elementos enumerados en orden cronológico y repetirá su instancia de campo.
items = Item.objects.filter(business_id = business_id) es incorrecto. Más bien deberías decir:
items = Item.objects.filter(business__id = business_id) #Observe el guion bajo doble.
También puede preferir obtener el negocio y simplemente decir:
business.item_set.all() #This would retrieve all Item for the business. select_related() espera un nombre de campo como parámetro. Por lo tanto, use un nombre de campo que exista en el modelo de artículo. Me gusta:
select_related('category')
¿Dónde está la comida? Sin embargo, puede ser que pueda continuar desde allí.