Django - 一个视图,多个URL?

Dan*_*Dan 7 python django views models

我对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'),
Run Code Online (Sandbox Code Playgroud)

然后在我看来我有这样的东西(实际上有几个其他参数,但无论输入的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)
Run Code Online (Sandbox Code Playgroud)

这对我来说似乎非常混乱.反正我还能把它弄干净吗?是否可以将过滤器参数放在某种数据结构中,然后将它们传递给Record.objects.filter行,而不是多次写出整个事物?

任何建议将不胜感激.

谢谢.

Chr*_*att 6

当然.你可以使用字典:

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

Record.objects.filter(**my_queryset_filters)
Run Code Online (Sandbox Code Playgroud)

**扩展字典为关键字参数.(还有*一个将列表扩展为位置参数.)