我正在努力实现这一目标。 1.单页网站,在同一模板上有列表和详细视图。 当网站加载时,我有缩略图和所有项目列表,我使用for循环和listview显示。
在我之下我有相同的东西(模型中的项目),但是以旋转木马的形式。(我可以在滑块中看到模型中的所有项目,包含完整的细节) 这些工作正常。
但我希望在同一个轮播滑块中有详细的视图。例如:用户可以看到项目列表(缩略图),当点击某个项目时,该特定项目应该在滑块中处于活动状态, 1.我无法获得列表和详细信息视图以在同一模板上工作。 2.i不能让详细视图在同一个轮播滑块中工作。
MODELS.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
VIEWS.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)
URLS.PY
urlpatterns = [
url(r'^$', views.HomeView.as_view(), name='home'),
url(r'^(?P<pk>[0-9]+)$', views.HomeView.as_view(), name='cheesedetail'),
答案 0 :(得分:1)
你在这里使用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
)。您可以动态地将内容加载/发送到服务器。然后你应该创建两个单独的视图 - ListView for Cheese和奶酪列表,然后是另一个带有搜索表单的DetailView并根据它获取数据。在模板中,您将定义类似window.onload = fetchDetailView()
的内容,然后定义发送方法,您就完成了。