0

J'ai un ListView (CBV générique) d'événements. Ce ListView doit être mis à jour de manière dynamique chaque jour, de sorte que les «anciens» événements (c'est-à-dire les événements déjà passés) soient exclus du context lorsqu'un utilisateur visite la page.Modification dynamique d'un ListView (par jour)

Je viens de remarquer que cette page ne se comporte pas comme prévu (un redémarrage du serveur est requis pour que le ListView se mette à jour). Je soupçonne que ce soit parce que je utilise la méthode queryset, et que je devrais faire le traitement plus tôt:

class EventDirectoryView(ListView): 
    model = Event 
    # Exclude objects that are expired 
    queryset = Event.objects.exclude(deadline__lt=(date.today()-timedelta(1))) 
    template_name = 'event-directory.html' 

Afin d'atteindre mon résultat souhaité, ce qui est le plus tôt que je devrais en train de modifier la queryset afin qu'il s'exécute chaque fois que la page est chargée?

Répondre

1

Vous devriez remplacer la méthode get_queryset():

class EventDirectoryView(ListView): 
    ... 
    def get_queryset(self): 
     return Event.objects.exclude(deadline__lt=(date.today()-timedelta(1))) 
+0

Ne pas le 'queryset' j'ai indiqué dans ma classe se [passé à get_queryset()] (https://docs.djangoproject.com/en /1.7/ref/class-based-views/mixins-single-object/#django.views.generic.detail.SingleObjectMixin.get_queryset)? – rnevius

+0

Oui, par défaut 'get_queryset()' renvoie l'attribut 'queryset' mais vous n'avez pas besoin du comportement par défaut. Vous devez créer un nouveau jeu de requête pour chaque requête au lieu d'utiliser le même jeu de requête pour toutes les demandes. C'est pourquoi vous devez remplacer cette méthode. – catavaran

+0

En regardant [le code source] (https://github.com/django/django/blob/master/django/views/generic/list.py#L26) a aidé à éclaircir cela. Essentiellement, 'queryset' est défini une fois. Si j'utilise la méthode 'get_queryset()' par défaut, sans la surcharger, la valeur 'queryset' d'origine est utilisée. Cette valeur 'queryset' est déterminée la première fois que la vue est demandée, et elle n'est pas" recalculée "après ce point. C'est pourquoi 'get_queryset()' doit être remplacé. Merci pour l'aide! – rnevius