Skip to main content
 首页 » 编程设计

python之在 Django 中为多个查询编写 View 的最佳方式

2024年09月03日31powertoolsteam

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

我有文章和视频,它们由模型上的“类型”字段决定。 Type = 'article' 等

我有一个 ListView ,它显示了 Item 模型中的所有对象,并按日期排序。

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') 
 

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

有没有比为每个查询编写一个新 View 更好的方法呢?因为,这就是我目前正在做的事情:

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') 
 
urls.py 
 
    path('new/', views.ItemListView.as_view(), name='new_list'), 
    path('new/articles', views.ItemListViewArticle.as_view(), name='article_list'), 
    path('new/videos', views.ItemListViewVideo.as_view(), name='video_list'), 
 

请您参考如下方法:

您可以使用 URL querystring (即 request.GET )从 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 

或者您可以使用 URL parameter获取数据类型:

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/