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

时间:2018-04-26 06:43:18

标签: django

我正在努力实现这一目标。 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'),

1 个答案:

答案 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()的内容,然后定义发送方法,您就完成了。