Stop War
Stop War

Reputation: 574

How to correctly display data from two related models in Django ListView

I have two models as below:

class Loo(models.Model):
    loo_type = models.CharField(max_length=3, default="LOO"...)
    loo_from = models.ForeignKey(Harr, on_delete=models.CASCADE, ...)
    loo_fac = models.DecimalField(max_digits=7, decimal_places=.....)

class Woo(models.Model):
    woo_item = models.AutoField(primary_key=True, ...)
    woo_loo = models.ForeignKey(Loo, on_delete=models.CASCADE, ...)
    woo_dt = models.DateField(null=True, ...)
    woo_rate = models.DecimalField(max_digits=7, decimal_places=.....)

I am trying to display data from the models using the following listview:

class WhoLooView(ListView):
    template_name = "who_loo_list.html"
    context_object_name = 'wholoos'
    model = Loo

    def get_context_data(self, **kwargs):
        context = super(WhoLooView, self).get_context_data(**kwargs)
        context.update({
            'woo_item_list': Woo.objects.order_by('-woo_dt'),
        })
        return context

    def get_queryset(self):
        return Loo.objects.order_by('loo_from')

Note that there can be more than one "woo_item" per instance of Loo (id), so in the listview there will be occasions when for the same Loo id it will have two instances of Woo/s, and thus need to be displayed separately (preferably in two distinct rows).

What I have tried so far creates extra (adjacent) columns for each Loo id and whichever Loo/s have a single instance of Woo, are shown in the normal fashion as expected.

How does one take care of such a situation. Can we have a nested row for cases where there are more than one instance of Woo?

Edit

What I have tried (based on your code sample):

{% for obj in wholoos %} <!-- wholoos : context object name -->
    {{ obj.loo_type }}
    {% for item in obj.woo_set.all %}
        {{ item.woo_dt }}
    {% endfor %}
{% endfor %}

But now I am not getting anything from the second model Woo.

Edit 2

I am getting the same result as earlier with my original code. Check the image below:

enter image description here

If you notice (in the image above), objects # 31 and 34 have one each of child objects (sub-objects). # 32 and 33 have two each. I want them to be in separate rows and not columns. The reason is, in case there are a number of items for each parent item (which my DB design makes it imperative to be), I would end up with an enormous number of extra columns for the sub-objects (and that too without any column header).

Upvotes: 1

Views: 93

Answers (1)

bmons
bmons

Reputation: 3392

you can loop the instances of Loo as shown, in your templates, don't have to override the get_context_data.

{% for obj in object_list %}
{{ obj.loo_type }}
{% for item in obj.woo_set.all %}
{{ item.woo_dt }}
{% endfor %}{% endfor %}

Upvotes: 0

Related Questions