如何在同一个单页网站模板上获取列表和详细信息视图



我正在努力实现这一目标。 1. 在同一模板上具有列表和详细信息视图的单页网站。 当网站加载时,我有包含所有项目列表的缩略图,我使用 for 循环和列表视图显示。

在此之下,我有同样的东西(模型中的项目),但以旋转木马的形式。(我可以在滑块中看到模型中的所有项目以及完整的详细信息) 这些工作正常。

但我想要在同一个轮播滑块中详细查看。 例如:用户可以看到项目列表(缩略图),当单击一个项目时,该特定项目应该在滑块中处于活动状态, 1.我无法使列表和详细信息视图在同一模板上工作。 2.我无法在同一轮播滑块中获取详细视图。

模型。.PY

class Cheese(models.Model):
TYPES_CHOICES=(
('COW', 'COW'),
('GOAT', 'GOAT'),
('SHEEP', 'SHEEP'),
('BUFFALO', 'BUFFALO'),
('COW, GOAT & SHEEP',  'COW, GOAT & SHEEP'),
('COW & SHEEP',  'COW & SHEEP')
)
COUNTRY_CHOICES=(
('USA', 'USA'),
('UK','UK'),
('ITALY', 'ITALY'),
('FRANCE', 'FRANCE'),
('NETHERLANDS', 'NETHERLANDS')
)

origin = models.CharField(max_length=100)
title =  models.CharField(max_length=100)
types =  models.CharField(max_length=100, choices=TYPES_CHOICES)
about =  models.TextField()
serve =  models.CharField(max_length=1000)
image = models.ImageField(
null=True,
blank=True,
width_field="width_field",
height_field= "height_field")
width_field = models.IntegerField(default=550)
height_field = models.IntegerField(default=550)
country = models.CharField(max_length=50, choices=COUNTRY_CHOICES)
timestamp = models.DateTimeField(auto_now_add=True, auto_now=False)

def __unicode__(self):
return self.title

视图。.PY

class HomeView(generic.ListView):
template_name= 'cheese/home.html'
model = Cheese
def get(self, request):
queryset_list = Cheese.objects.all()
queryset_wine = Wine.objects.all()
form = FeedbackForm()
#basic search query
query = request.GET.get("q")
if query:
queryset_list = queryset_list.filter(
Q(title__icontains=query)|
Q(origin__icontains=query)|
Q(types__icontains=query)|
Q(about__icontains=query)
).distinct()
context={
'cheese': queryset_list,
'form': form,
'wine': queryset_wine,
}  
return render(request, self.template_name, context)

网址。.PY

urlpatterns = [
url(r'^$', views.HomeView.as_view(), name='home'),
url(r'^(?P<pk>[0-9]+)$', views.HomeView.as_view(), name='cheesedetail'),

]

你在这里以一种可怕的方式使用 CBV 进行HomeView,我几乎没有注意到你使用 CBV。永远不要在 get 方法中重写render。我看到您因为将某些项目附加到上下文而覆盖了它。然后将项目附加到上下文中,不要覆盖渲染!

class HomeView(ListView):
template_name = 'cheese/home.html'
query = Cheese.objects.all()
def get_queryset(self):
queryset = super().get_queryset()
search_query = self.request.GET.get("q")
return queryset.filter(
Q(title__icontains=search_query)|
Q(origin__icontains=search_query)|
Q(types__icontains=search_query)|
Q(about__icontains=search_query)
).distinct()
def get_context(self):
context = super().get_context() # gets context from parent method0
context['form'] = FeedbackForm()
context['wines'] = Wine.objects.all()
return context

使用CBV的主要概念是它往往更有条理,并且基于继承。

您应该考虑使用异步 JavaScript API 调用(例如AJAX) 在您的模板中。您可以将内容动态加载/发送到服务器。然后,您应该创建两个单独的视图 - 带有奶酪列表的奶酪列表视图,然后是另一个带有搜索表单并基于它获取数据的 DetailView。在模板中,您将定义类似window.onload = fetchDetailView()的东西,然后定义发送方方法,您就完成了。

最新更新