Лучший способ написать представления для нескольких запросов в Django? - PullRequest
2 голосов
/ 13 мая 2019

Это простой вопрос.Я организовал свои модели так, чтобы большинство объектов, представленных на странице, были одного типа - Item.Модель содержит различные атрибуты, которые помогают мне обслуживать ее по-разному.

У меня есть статьи и видео, которые определяются полем типа в модели.Type = 'article' и т. Д.

У меня есть просмотр списка, который показывает все объекты в модели 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')

Мне нужен просмотр, отображающий все статьи, отсортированные по дате, и все видео, отсортированные по дате.У меня есть чувство, что я напишу еще много таких представлений.

Есть ли лучший способ сделать это, чем написать новое представление для каждого отдельного запроса?Как, это то, что я сейчас делаю:

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

1 Ответ

2 голосов
/ 13 мая 2019

Вы можете использовать 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 , чтобы получить тип данных:

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/
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...