Django/将多个模型传递到我的ListView

2024-06-13 19:50:56 发布

您现在位置:Python中文网/ 问答频道 /正文

这是我的第一个项目,我试图将多个模型传递到我的ListView,并通过不同的上下文\对象\名称将它们传递到我的模板/索引中,但似乎有一种快捷方式或另一种方法我没有找到

型号.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'

索引/模板

{% 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 %} 

任何帮助或建议,以解决它,甚至清理我的代码,我将不胜感激


Tags: namepydivimgmodelstophtmlcard
2条回答

首先,我认为您必须更新您的模型,因为它们是相关的,并且大多数字段都是重复的。否则,如果您不想在模型中进行任何更新,那么对于基于类的视图,您必须通过重写get\u context\u data方法向传递到模板的上下文添加额外数据

请检查更新的index.html和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>

视图。py: 来自。型号进口Kunafa、Crunchy_Kunafa、Baklawa、Topping 从django.views.generic导入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'

如果您想使用基于功能的视图的相同模型,其非常简单,如下所示:

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})

您可以这样做,首先您应该调用基本上下文并将字典作为上下文添加到其中

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

相关问题 更多 >