Джанго - Один взгляд, несколько URL? - PullRequest
7 голосов
/ 14 сентября 2011

Я довольно новичок как в 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, вместо того, чтобы выписывать все это несколько раз?

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

Спасибо.

1 Ответ

6 голосов
/ 14 сентября 2011

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

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

Record.objects.filter(**my_queryset_filters)

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

...