Django - 一个视图,多个URL?
我刚接触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)
这里的 **
是把字典里的内容展开成关键字参数。(还有 *
,它是把列表里的内容展开成位置参数。)