Джанго - Один просмотр, несколько URL?

Я довольно новичок в Python и Django и хотел бы по возможности следовать рекомендациям. Я хотел бы привести в порядок следующий код, чтобы с ним было легче работать.

Я пытаюсь настроить представление, к которому можно получить доступ через несколько URL-адресов, которые предоставляют разные параметры, для которых будет возвращаться и отображаться набор запросов.

Я настроил следующие URL:

    url(r'^myrecords/$', login_required(RecordListView.as_view()), {'filter': 'all'}, name='myrecords'),
    url(r'^myrecords/page(?P<page>[0-9]+)/$', login_required(RecordListView.as_view()), {'filter': 'all'}, name='myrecords'),
    url(r'^myrecords/(?P<year>\d{4})/$', login_required(RecordListView.as_view()), {'filter': 'year'}, name='myrecords'),
    url(r'^myrecords/last(?P<months>[0-9]{1,2})months/$', login_required(RecordListView.as_view()), {'filter': 'month'}, name='myrecords'),

Тогда, на мой взгляд, у меня есть что-то вроде этого (на самом деле есть несколько других параметров, но они должны оставаться неизменными независимо от введенного URL.):

def get_queryset(self): 
    if (self.kwargs['filter'] == 'month'):
        x_months_ago = (datetime.date.today() - 
        datetime.timedelta(int(self.kwargs['months']) * 365 / 12))
        queryset = Record.objects.filter(user=self.request.user, 
        date__gte = x_months_ago.isoformat())
    elif (self.kwargs['filter'] == 'year'):
        queryset = Record.objects.filter(user=self.request.user, date__year=self.kwargs['year'])
    else
        queryset = Record.objects.filter(user=self.request.user)

Это кажется мне очень грязным. Могу ли я сделать его чище? Можно ли поместить параметры фильтра в какую-то структуру данных, а затем просто передать их в строку Record.objects.filter вместо того, чтобы выписывать все это несколько раз?

Любой совет будет принят с благодарностью.

Спасибо.

7 голосов | спросил Dan 14 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowWed, 14 Sep 2011 21:27:46 +0400 2011, 21:27:46

1 ответ


0

Конечно. Вы можете использовать словарь:

my_queryset_filters = {
    'user': self.request.user,
    'date__year': self.kwargs['year'],
}

Record.objects.filter(**my_queryset_filters)

** расширяет словарь в аргументы ключевого слова. (Также есть *, который расширяет список в позиционные аргументы.)

ответил Chris Pratt 14 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowWed, 14 Sep 2011 21:40:51 +0400 2011, 21:40:51

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132