2011-09-14 4 views
7

Je suis relativement nouveau à la fois avec Python et Django et j'aimerais suivre les meilleures pratiques lorsque cela est possible. Je voudrais ranger le code suivant pour le rendre plus facile à travailler. J'essaye de mettre en place une vue qui peut être accédée par l'intermédiaire de plusieurs URL qui fournissent différents paramètres pour lesquels un jeu de requête sera retourné et affiché.Django - Une vue, plusieurs URL?

J'ai mis en place les URL suivantes:

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

Alors à mon avis j'ai quelque chose comme ça (Il y a en fait plusieurs autres paramètres, mais ceux-ci devraient rester les mêmes quel que soit l'URL saisie.):

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) 

Cela me semble très compliqué. Y at-il de toute façon je peux le rendre plus propre? Est-il possible de placer les paramètres du filtre dans une sorte de structure de données et de simplement les passer à la ligne Record.objects.filter, plutôt que d'écrire plusieurs fois le tout?

Un conseil serait grandement apprécié.

Merci.

Répondre

6

Bien sûr. Vous pouvez utiliser un dictionnaire:

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

Record.objects.filter(**my_queryset_filters) 

Le ** élargit le dictionnaire en arguments de mot-clé. (Il y a aussi * qui développe une liste en arguments positionnels.)

Questions connexes