2011-09-14 25 views
7

私はPythonとDjangoの両方にかなり新しいので、可能な限りベストプラクティスに従いたいと考えています。私は以下のコードを整理して作業しやすくしたいと思います。Django - 1つのビュー、複数のURL?

私は、クエリーセットが返されて表示されるさまざまなパラメータを提供する複数の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行に渡すことは可能ですか?

アドバイスをいただければ幸いです。

ありがとうございました。

答えて

6

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

Record.objects.filter(**my_queryset_filters) 

**はキーワード引数に辞書を拡張します。あなたは辞書を使用することができます。 (リストを位置引数に展開する*もあります)

関連する問題