nesu
nesu

Reputation: 35

Django - How do I render a parent object in template?

I need to display some product's supplier, next to {{product.description}} but I can't get it to show on my table.

models.py

class Supplier(models.Model):
name = models.CharField(max_length=200, null=True)
phone = models.CharField(max_length=200, null=True, blank=True)
email = models.CharField(max_length=200, null=True, blank=True)
date_created = models.DateTimeField(auto_now_add=True, null=True)

def __str__(self):
    return self.name


class Product(models.Model):
sku = models.IntegerField(null=True)
description = models.CharField(max_length=30)
costprice = models.FloatField(null=True, max_length=99, blank=True)
retailprice = models.FloatField(null=True, max_length=99, blank=True)
barcode = models.CharField(null=True, max_length=99, unique=True)
image = models.ImageField(null=True, blank=True)
supplier = models.ForeignKey(Supplier, on_delete=models.CASCADE, null=True)

def __str__(self):
    return self.description

views.py

def products(request):
products = Product.objects.all()
suppliers = Supplier.objects.all()
context = {'products': products,
           'suppliers': suppliers}
return render(request, 'crmapp/products.html', context)

products.html

<tr>
{% for product in products %}
  <td>{{product.id}}</td>
  <td><h6><strong>{{product.description}}</strong></h6></td>
  <td >{{products.supplier}}</td>
  <td>£{{product.costprice |floatformat:2}}</td>
  <td>£{{product.retailprice |floatformat:2}}</td>
  <td>{{product.barcode}}</td>
  
</tr>
{% endfor %}

Upvotes: 0

Views: 213

Answers (1)

Saturnix
Saturnix

Reputation: 10564

Spelling mistake, I think.

 <td >{{products.supplier}}</td>

Must be:

 <td >{{product.supplier}}</td>

Notice I've removed the s in products.


Also, you don't need this in your views.py:

suppliers = Supplier.objects.all()

{{product.supplier}} will trigger a query to the db. To avoid that, use prefetch_related.

products = Product.objects.all().prefetch_related('supplier')

Note that this is optional. It will just improve efficency, but merely fixing the spelling mistake answers your question.

Upvotes: 2

Related Questions