Django - 一个视图,多个URL?

6 投票
1 回答
3172 浏览
提问于 2025-04-17 02:18

我刚接触Python和Django,想尽量遵循最佳实践。我想把以下代码整理得更好一些,这样使用起来会更方便。

我正在尝试设置一个视图,可以通过多个网址访问,这些网址提供不同的参数,以便返回和显示不同的查询结果。

我设置了以下网址:

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

然后在我的视图中,我有这样的代码(其实还有其他几个参数,但这些参数无论输入哪个网址都应该保持不变):

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 个回答

5

当然可以。你可以使用字典:

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

Record.objects.filter(**my_queryset_filters)

这里的 ** 是把字典里的内容展开成关键字参数。(还有 *,它是把列表里的内容展开成位置参数。)

撰写回答