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.