如何在django 2.2中的一个基于类的视图中收集所有模型中的所有对象

如何在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

我的一个朋友正试图在一个视图中收集他每个模型的所有数据,以“slug”作为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'

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文档,以便清楚地说明他是如何引用对象的。。。