django / 将多个模型传递给我的 ListView
django / pass multiple models to my ListView
这是我的第一个项目,我正在尝试将多个模型传递到我的 ListView 并通过不同的 context_object_names 将它们传递到我的 template/index,但似乎有捷径或其他方法可以做到这一点我错过了。
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 %}
任何帮助或建议来解决它甚至清理我的代码,我将不胜感激。
你可以这样做,首先你应该调用基础上下文并将字典添加到它作为上下文
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
首先,我相信你必须更新你的模型,因为它们是相关的,并且大多数字段是 repeated.Else 如果你不想在模型中进行任何更新,那么对于基于 class 的视图你必须通过覆盖 get_context_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>
views.py:
from .models import Kunafa, Crunchy_kunafa, 果仁蜜饼, 浇头
来自 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})
这是我的第一个项目,我正在尝试将多个模型传递到我的 ListView 并通过不同的 context_object_names 将它们传递到我的 template/index,但似乎有捷径或其他方法可以做到这一点我错过了。
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 %}
任何帮助或建议来解决它甚至清理我的代码,我将不胜感激。
你可以这样做,首先你应该调用基础上下文并将字典添加到它作为上下文
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
首先,我相信你必须更新你的模型,因为它们是相关的,并且大多数字段是 repeated.Else 如果你不想在模型中进行任何更新,那么对于基于 class 的视图你必须通过覆盖 get_context_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>
views.py: from .models import Kunafa, Crunchy_kunafa, 果仁蜜饼, 浇头 来自 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})