Search code examples
djangopython-3.xdjango-2.1

Django - Fetch all related in template loop


I have a data table that creates a row for every Store object. I am using Django 2.1

<tbody>
{% for store in stores %}
    <tr id="table-row">
        <td><a href="/stores/{{ store.pk }}">{{ store.store_number }}</a></td>
        <td><a href="/stores/{{ store.pk }}">{{ store.name }}</a></td>
        <td>{{ store.phone }}</td>
        <td>{{ store.city }}</td>
        <td>{{ store.state }}</td>
        {% for circuit in circuits %}
            <td>{{ circuit }}</td>
        {% endfor %}
        <td>{{ store.postal }}</td>

    </tr>
{% endfor %}
</tbody>

What I'm wanting to do is create a table column for every circuit where store is the given store number.

Models:

class Store(models.Model):
    store_number = models.IntegerField(default=0000, unique=True)
    name = models.CharField(max_length=100)
    phone = models.CharField(max_length=15)
    xo_tn = models.CharField(max_length=15, null=True)
    street_address = models.CharField(max_length=50, null=True)
    city = models.CharField(max_length=50, null=True)
    state = models.CharField(max_length=50, null=True)
    postal = models.CharField(max_length=15, null=True)
    timezone = models.CharField(max_length=40, null=True)
    date_opened = models.DateField(blank=True, null=True)
    date_closed = models.DateField(blank=True, null=True)

    def __str__(self):
        string = '{0} - {1}'.format(self.store_number, self.name)
        return string

    def number(self):
        return self.store_number

class Circuit(models.Model):
    circuit_id = models.CharField(max_length=100)
    store = models.ForeignKey(Store, null=True, on_delete=models.SET_NULL)
    provider = models.ForeignKey(Provider, blank=True, null=True, on_delete=models.SET_NULL)
    configuration = models.ForeignKey(CircuitConfiguration, null=True, on_delete=models.SET_NULL)
    registered_on = models.DateTimeField(auto_now=True)
    delivered_on = models.DateField(auto_now=True)
    is_active = models.BooleanField(default=True)

    def __str__(self):
        return self.circuit_id

View:

@login_required
def stores(request):
    stores = Store.objects.exclude(street_address__contains="closed").all()
    context = {
        'stores':stores,  
    }
    return render(request, 'all_stores.html', context)

I have not tried much of anything yet, because I'm unsure how I could do this without breaking the relationship or performing the query from my front end.


Solution

  • In django relationship, you can use reverse accessor. See this document.

    In your case, your template code will be:

    <tbody>
    {% for store in stores %}
        <tr id="table-row">
            <td><a href="/stores/{{ store.pk }}">{{ store.store_number }}</a></td>
            <td><a href="/stores/{{ store.pk }}">{{ store.name }}</a></td>
            <td>{{ store.phone }}</td>
            <td>{{ store.city }}</td>
            <td>{{ store.state }}</td>
            {% for circuit in store.circuit_set.all %}
                <td>{{ circuit }}</td>
            {% endfor %}
            <td>{{ store.postal }}</td>
    
        </tr>
    {% endfor %}
    </tbody>
    

    See this question also.