如何在django 2.2中的一个基于类的视图中收集所有模型中的所有对象
我的一个朋友正试图在一个视图中收集他每个模型的所有数据,以“slug”作为URL显示在一个夯实机上 他目前有一个基于类的视图,如下所示:如何在django 2.2中的一个基于类的视图中收集所有模型中的所有对象,django,django-models,django-views,django-queryset,django-2.2,Django,Django Models,Django Views,Django Queryset,Django 2.2,我的一个朋友正试图在一个视图中收集他每个模型的所有数据,以“slug”作为URL显示在一个夯实机上 他目前有一个基于类的视图,如下所示: from itertools import chain class ProductDetailView(DetailView): queryset1 = BooksProduct.objects.all() queryset2 = ClothingProduct.objects.all() queryset3 = Furniture
from itertools import chain
class ProductDetailView(DetailView):
queryset1 = BooksProduct.objects.all()
queryset2 = ClothingProduct.objects.all()
queryset3 = FurnitureProduct.objects.all()
queryset4 = DecoratingProduct.objects.all()
queryset = chain(queryset1, queryset2, queryset3, queryset4)
template_name = 'products/detail.html'
urlpatterns =[
path('product-detail/<slug>/', ProductDetailView.as_view(), name='product-detail'),
]
<section id="detail-view">
<div class="container">
<div class="row">
<div class="col-6">
<img src="{{ product.image.url }}" alt="{{ product.title }}">
</div>
<div class="col-6">
{% for product in object_list %}
<h1>{{ product.title }}</h1>
<strong>£{{ product.price }}</strong>
<hr class="newhr">
<a href="" class="btn btn-customtwo btn-block">ADD TO BASKET</a>
<div class="detail-desc-box">
<p>{{ product.description }}</p>
</div>
{% endfor %}
</div>
</div>
</div>
</section>
from itertools import chain
class ProductDetailView(ListView):
queryset1 = BooksProduct.objects.all()
queryset2 = ClothingProduct.objects.all()
queryset3 = FurnitureProduct.objects.all()
queryset4 = DecoratingProduct.objects.all()
queryset = chain(queryset1, queryset2, queryset3, queryset4)
template_name = 'products/detail.html'
URL如下所示:
from itertools import chain
class ProductDetailView(DetailView):
queryset1 = BooksProduct.objects.all()
queryset2 = ClothingProduct.objects.all()
queryset3 = FurnitureProduct.objects.all()
queryset4 = DecoratingProduct.objects.all()
queryset = chain(queryset1, queryset2, queryset3, queryset4)
template_name = 'products/detail.html'
urlpatterns =[
path('product-detail/<slug>/', ProductDetailView.as_view(), name='product-detail'),
]
<section id="detail-view">
<div class="container">
<div class="row">
<div class="col-6">
<img src="{{ product.image.url }}" alt="{{ product.title }}">
</div>
<div class="col-6">
{% for product in object_list %}
<h1>{{ product.title }}</h1>
<strong>£{{ product.price }}</strong>
<hr class="newhr">
<a href="" class="btn btn-customtwo btn-block">ADD TO BASKET</a>
<div class="detail-desc-box">
<p>{{ product.description }}</p>
</div>
{% endfor %}
</div>
</div>
</div>
</section>
from itertools import chain
class ProductDetailView(ListView):
queryset1 = BooksProduct.objects.all()
queryset2 = ClothingProduct.objects.all()
queryset3 = FurnitureProduct.objects.all()
queryset4 = DecoratingProduct.objects.all()
queryset = chain(queryset1, queryset2, queryset3, queryset4)
template_name = 'products/detail.html'
此时,单击单个产品以获取product-detail.html视图会导致以下错误:
“itertools.chain”对象没有属性“all”
他如何将每个模型的所有产品累积到一个视图中
此后,DetailView已更改为ListView,从而使产品详细信息呈现到模板中,但是,只要您尝试刷新页面,或按“上一步”按钮并重新单击产品以再次查看详细信息页面,它就会消失,直到他再次重置服务器
HTML模板如下所示:
from itertools import chain
class ProductDetailView(DetailView):
queryset1 = BooksProduct.objects.all()
queryset2 = ClothingProduct.objects.all()
queryset3 = FurnitureProduct.objects.all()
queryset4 = DecoratingProduct.objects.all()
queryset = chain(queryset1, queryset2, queryset3, queryset4)
template_name = 'products/detail.html'
urlpatterns =[
path('product-detail/<slug>/', ProductDetailView.as_view(), name='product-detail'),
]
<section id="detail-view">
<div class="container">
<div class="row">
<div class="col-6">
<img src="{{ product.image.url }}" alt="{{ product.title }}">
</div>
<div class="col-6">
{% for product in object_list %}
<h1>{{ product.title }}</h1>
<strong>£{{ product.price }}</strong>
<hr class="newhr">
<a href="" class="btn btn-customtwo btn-block">ADD TO BASKET</a>
<div class="detail-desc-box">
<p>{{ product.description }}</p>
</div>
{% endfor %}
</div>
</div>
</div>
</section>
from itertools import chain
class ProductDetailView(ListView):
queryset1 = BooksProduct.objects.all()
queryset2 = ClothingProduct.objects.all()
queryset3 = FurnitureProduct.objects.all()
queryset4 = DecoratingProduct.objects.all()
queryset = chain(queryset1, queryset2, queryset3, queryset4)
template_name = 'products/detail.html'
亲切问候我认为您无法像希望的那样使用开箱即用的通用视图。原因是DetailView专门用于显示单个模型实例。您正在尝试显示多个 我建议将其切换到
列表视图
,为视图提供一个额外的url关键字参数以指定slug,然后执行以下操作之一:
您当前遇到的错误是因为您正在有效地将
DetailView.queryset
的类型从queryset
更改为生成器。通用视图的其余部分希望某些成员出现,例如.all()
,因此,他从DetailView更改为ListView,并立即开始在detail.html页面中呈现信息,但是,如果我们刷新页面,信息完全消失,不再出现。我将在上面附上他的HTML文档,以便清楚地说明他是如何引用对象的。。。