Ayob Saleh
Ayob Saleh

Reputation: 13

django / pass multiple models to my ListView

It's my first project and I'm trying to pass multiple models to my ListView and get them to my template/index via different context_object_names but there seems to be shortcut or another way to do it that I'm missing.

models.py

from django.db import models

class Kunafa(models.Model):
    
    name = models.CharField(max_length=100)
    img = models.ImageField(upload_to='pics')
    desc = models.TextField()
    price = models.IntegerField()
    offer = models.BooleanField(default=False)


class Baklawa(models.Model):
    
    name = models.CharField(max_length=100)
    img = models.ImageField(upload_to='pics')
    desc = models.TextField()
    price = models.IntegerField()
    offer = models.BooleanField(default=False)
    

class Crunchy_kunafa(models.Model):
    
    name = models.CharField(max_length=100)
    img = models.ImageField(upload_to='pics')
    desc = models.TextField()
    price = models.IntegerField()
    offer = models.BooleanField(default=False)

class Topping(models.Model):
    
    name = models.CharField(max_length=100)
    price = models.IntegerField()

views.py

from .models import Kunafa, Crunchy_kunafa, Baklawa, Topping
from django.views.generic import ListView

class HomeView(ListView):
    model = Kunafa
    template_name = 'index.html'
    context_object_name = 'Kunafa'

class HomeView(ListView):
    model = Baklawa
    template_name = 'index.html'
    context_object_name = 'Baklawa'

class HomeView(ListView):
    model = Crunchy_kunafa
    template_name = 'index.html'
    context_object_name = 'Crunchy_kunafa'

class HomeView(ListView):
    model = Topping
    template_name = 'index.html'
    context_object_name = 'Topping'

index/template

{% extends 'base.html' %}
{% block body %}

<div class="album py-5 bg-light">
    <div class="container">
        <div class="row">
            {% for kun in Kunafa %}
                <div class="col-md-4">
                    <div class="card mb-4 box-shadow">
                        <img class="card-img-top" src="https://via.placeholder.com/250x200" alt="card image cap">
                        <div class="card-body">
                            <h4 class=""><a href="{{ core.get_absolute_url }}">{{ kun.name }}</a></h4>
                            <p class="card-text"></p>
                        </div>
                    </div>
                </div>
            {% endfor %}
        </div>
    </div>
</div>

<div class="album py-5 bg-light">
    <div class="container">
        <div class="row">
            {% for bak in Baklava %}
                <div class="col-md-4">
                    <div class="card mb-4 box-shadow">
                        <img class="card-img-top" src="https://via.placeholder.com/250x200" alt="card image cap">
                        <div class="card-body">
                            <h4 class=""><a href="{{ core.get_absolute_url }}">{{ bak.name }}</a></h4>
                            <p class="card-text"></p>
                        </div>
                    </div>
                </div>
            {% endfor %}
        </div>
    </div>
</div>
<div class="album py-5 bg-light">
    <div class="container">
        <div class="row">
            {% for crun in Crunchy_kunafa %}
                <div class="col-md-4">
                    <div class="card mb-4 box-shadow">
                        <img class="card-img-top" src="https://via.placeholder.com/250x200" alt="card image cap">
                        <div class="card-body">
                            <h4 class=""><a href="{{ core.get_absolute_url }}">{{ crun.name }}</a></h4>
                            <p class="card-text"></p>
                        </div>
                    </div>
                </div>
            {% endfor %}
        </div>
    </div>
</div>
<div class="album py-5 bg-light">
    <div class="container">
        <div class="row">
            {% for top in Topping %}
                <div class="col-md-4">
                    <div class="card mb-4 box-shadow">
                        <img class="card-img-top" src="https://via.placeholder.com/250x200" alt="card image cap">
                        <div class="card-body">
                            <h4 class=""><a href="{{ core.get_absolute_url }}">{{ top.name }}</a></h4>
                            <p class="card-text"></p>
                        </div>
                    </div>
                </div>
            {% endfor %}
        </div>
    </div>
</div>


{% endblock %} 

Any help or advice to resolve it or even clean up my code, I'd appreciate it a lot.

Upvotes: 1

Views: 1306

Answers (2)

Ashish Nautiyal
Ashish Nautiyal

Reputation: 931

First off all i believe you have to update your models as they are related and most of fields are repeated.Else if you don't want any update in model then For class based view you have to add extra data to context being passed to template by overriding get_context_data method.

Please check with updated index.html and views.py:

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />

  </head>
  <body>
      
    <div class="album py-5 bg-light">
        <div class="container">
            <div class="row">
                {% for kun in Kunafa %}
                    <div class="col-md-4">
                        <div class="card mb-4 box-shadow">
                            <!-- <img class="card-img-top" src="https://via.placeholder.com/250x200" alt="card image cap">-->
                            <div class="card-body">
                                <h4 class=""><a href="{{ kun.get_absolute_url }}">{{ kun.name }}</a></h4>
                                <p class="card-text"></p>
                            </div>
                        </div>
                    </div>
                {% endfor %}
            </div>
        </div>
    </div>
    
    <div class="album py-5 bg-light">
        <div class="container">
            <div class="row">
                {% for bak in Baklawa %}
                    <div class="col-md-4">
                        <div class="card mb-4 box-shadow">
                            <!-- <img class="card-img-top" src="https://via.placeholder.com/250x200" alt="card image cap"> -->
                            <div class="card-body">
                                <h4 class=""><a href="{{ core.get_absolute_url }}">{{ bak.name }}</a></h4>
                                <p class="card-text"></p>
                            </div>
                        </div>
                    </div>
                {% endfor %}
            </div>
        </div>
    </div>
    <div class="album py-5 bg-light">
        <div class="container">
            <div class="row">
                {% for crun in Crunchy_kunafa %}
                    <div class="col-md-4">
                        <div class="card mb-4 box-shadow">
                            <!-- <img class="card-img-top" src="https://via.placeholder.com/250x200" alt="card image cap"> -->
                            <div class="card-body">
                                <h4 class=""><a href="{{ core.get_absolute_url }}">{{ crun.name }}</a></h4>
                                <p class="card-text"></p>
                            </div>
                        </div>
                    </div>
                {% endfor %}
            </div>
        </div>
    </div>
    <div class="album py-5 bg-light">
        <div class="container">
            <div class="row">
                {% for top in Topping %}
                    <div class="col-md-4">
                        <div class="card mb-4 box-shadow">
                            <!-- <img class="card-img-top" src="https://via.placeholder.com/250x200" alt="card image cap"> -->
                            <div class="card-body">
                                <h4 class=""><a href="{{ core.get_absolute_url }}">{{ top.name }}</a></h4>
                                <p class="card-text"></p>
                            </div>
                        </div>
                    </div>
                {% endfor %}
            </div>
        </div>
    </div>
  </body>
</html>

views.py: from .models import Kunafa, Crunchy_kunafa, Baklawa, Topping from django.views.generic import ListView

class HomeView(ListView):
    model = Kunafa
    template_name = 'index.html'
    context_object_name = 'Kunafa'

    def get_context_data(self, **kwargs):
         context = super(HomeView, self).get_context_data(**kwargs)
         context['Baklawa'] = Baklawa.objects.all()
         context['Crunchy_kunafa'] = Crunchy_kunafa.objects.all()
         context['Topping'] = Topping.objects.all()
         return context

# class HomeView(ListView):
#     model = Baklawa
#     template_name = 'index.html'
#     context_object_name = 'Baklawa'

# class HomeView(ListView):
#     model = Crunchy_kunafa
#     template_name = 'index.html'
#     context_object_name = 'Crunchy_kunafa'

# class HomeView(ListView):
#     model = Topping
#     template_name = 'index.html'
#     context_object_name = 'Topping'

If you want to go with the same models with function based views its pretty simple as below:

def home_view(request):
    Kunafa_list = Kunafa.objects.all()
    Baklawa_list = Baklawa.objects.all()
    Crunchy_kunafa_list = Crunchy_kunafa.objects.all()
    Topping_list = Topping.objects.all()
    return render(request,'index.html',{'Kunafa_list':Kunafa_list,'Baklawa_list':Baklawa_list,'Crunchy_kunafa_list':Crunchy_kunafa,'Topping_list':Topping_list})

Upvotes: 2

lord stock
lord stock

Reputation: 1201

You could do like this first you should call base context and add dictionary to it as context

from django.views.generic import ListView

class HomeView(ListView):
    model = Kunafa
    template_name = 'index.html'

    def get_context_data(self, **kwargs):
        # Call the base implementation first to get a context
        context = super(HomeView, self).get_context_data(**kwargs)
        # Add in a QuerySet of all the Baklawa
        context['baklawa'] = Baklawa.objects.all()
        context['crunchy_kunafa'] = Crunchy_kunafa.objects.all()
        return context

Upvotes: 2

Related Questions