Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在Django中为多个查询编写视图的最佳方法?_Python_Django_List_View - Fatal编程技术网

Python 在Django中为多个查询编写视图的最佳方法?

Python 在Django中为多个查询编写视图的最佳方法?,python,django,list,view,Python,Django,List,View,这是一个简单的问题。我已经组织了我的模型,以便页面上的大多数对象都是同一类型的-项。该模型包含各种属性,这些属性可以帮助我以不同的方式提供服务 我有文章和视频,它们由模型上的“类型”字段决定。类型=‘物品’等 我有一个listview,它显示项目模型中的所有对象,按日期排序 class ItemListView(generic.ListView): # This handles the logic for the UserForm and ProfileForm - without i

这是一个简单的问题。我已经组织了我的模型,以便页面上的大多数对象都是同一类型的-项。该模型包含各种属性,这些属性可以帮助我以不同的方式提供服务

我有文章和视频,它们由模型上的“类型”字段决定。类型=‘物品’等

我有一个listview,它显示项目模型中的所有对象,按日期排序

class ItemListView(generic.ListView):

    # This handles the logic for the UserForm and ProfileForm - without it, nothing happens.
    def item(self, request, *args, **kwargs):
        return index(request)

    def get_queryset(self):
        # return Post.objects.filter(published_date__lte=timezone.now()).order_by('-published_date')
        return Item.objects.all().order_by('-create_date')

我想要一个视图,显示所有的文章,按日期排序,所有的视频,按日期排序。我有一种感觉,我会写更多这样的观点

有没有比为每个查询编写新视图更好的方法?这就是我目前正在做的:

Views.py

class ItemListViewArticle(generic.ListView):

    # This handles the logic for the UserForm and ProfileForm - without it, nothing happens.
    def item(self, request, *args, **kwargs):
        return index(request)

    def get_queryset(self):
        # return Post.objects.filter(published_date__lte=timezone.now()).order_by('-published_date')
        return Item.objects.filter(type__contains='article').order_by('-create_date')

class ItemListViewVideo(generic.ListView):

    # This handles the logic for the UserForm and ProfileForm - without it, nothing happens.
    def item(self, request, *args, **kwargs):
        return index(request)

    def get_queryset(self):
        # return Post.objects.filter(published_date__lte=timezone.now()).order_by('-published_date')
        return Item.objects.filter(type__contains='video').order_by('-create_date')

您可以使用(即)从url获取项目类型并按其进行筛选。像这样:

path('new/', views.ItemListView.as_view(), name='new_list'),


class ItemListViewArticle(generic.ListView):

    def item(self, request, *args, **kwargs):
        return index(request)

    def get_queryset(self):
        content_type = self.request.GET.get('type')
        return Item.objects.filter(type__contains=content_type).order_by('-create_date')

# usage
localhost:8000/new/?type=article
localhost:8000/new/?type=video
或者,您可以使用获取数据类型:

path('new/<str:content_type>/', views.ItemListView.as_view(), name='new_list'),

class ItemListViewArticle(generic.ListView):

    def item(self, request, *args, **kwargs):
        return index(request)

    def get_queryset(self):
        content_type = self.kwargs.get('content_type')
        return Item.objects.filter(type__contains=content_type).order_by('-create_date')

# usage
localhost:8000/new/article/
localhost:8000/new/video/
path('new/',views.ItemListView.as_view(),name='new_list'),
类ItemListViewArticle(generic.ListView):
def项(自身、请求、*args、**kwargs):
返回索引(请求)
def get_queryset(自我):
content\u type=self.kwargs.get('content\u type')
return Item.objects.filter(type\u contains=content\u type).order\u by('-create\u date'))
#用法
本地主机:8000/新/文章/
本地主机:8000/新/视频/

您发布的代码中没有任何内容会调用
方法。除非您的问题中没有包含其他代码,否则您应该将其删除。我是从模板中的下拉列表中调用它们的-一个指向视图的简单href链接。这没有什么意义。您不能直接从模板调用方法-您的浏览器执行一个请求,Django将该请求传递给视图,视图可以调用方法。如果您没有调用
item
方法的Python代码,那么它什么也做不了。我以前没见过,所以这很有用。从URL获取信息非常有用,它可以使视图中的内容更有条理!酷。如果这个答案对您有帮助,请:)
path('new/<str:content_type>/', views.ItemListView.as_view(), name='new_list'),

class ItemListViewArticle(generic.ListView):

    def item(self, request, *args, **kwargs):
        return index(request)

    def get_queryset(self):
        content_type = self.kwargs.get('content_type')
        return Item.objects.filter(type__contains=content_type).order_by('-create_date')

# usage
localhost:8000/new/article/
localhost:8000/new/video/