Je le ferai à chaque fois, donc comme mémo pour moi-même. Je suis déçu car je n'ai pas pu trouver un titre convenable. ..
Lors de la mise en œuvre d'articles de presse dans Django, je pense qu'il est courant de définir des champs tels que la date et l'heure de publication et la date d'expiration et de basculer entre public et privé par rapport à la date et l'heure actuelles, mais comme suit Il n'est pas bon d'écrire.
from django.db import models
from django.utils import timezone
class ArticleManager(models.Manager):
def published(self):
qs = self.get_queryset()
return qs.filter(published_at__lte=timezone.now())
class Article(models.Model):
title = models.CharField('Titre', max_length=100)
published_at = models.DateTimeField('Date et heure de publication', default=timezone.now)
objects = ArticleManager()
class ArticleView(ListView):
queryset = Article.objects.published() #Ce n'est pas bien
# queryset = Article.objects.filter(published_at__lte=timezone.now()) #Bien sûr, c'est aussi inutile
Si vous y réfléchissez un instant, vous pouvez voir que le queryset
spécifié dans ʻArticleView est une
variable de classe, donc la classe est lue et la valeur est déterminée au démarrage du serveur. ʻArticle.objects.published ()
fonctionne à la date et à l'heure auxquelles ce processus a été exécuté, donc dans le cas ci-dessus, il fonctionne comme l'heure à laquelle le serveur a démarré est l'heure actuelle
.
Ce que je veux faire, c'est «je veux juger si c'est public ou privé en fonction de la date et de l'heure demandées», donc si vous faites ce qui suit, cela fonctionnera correctement.
from django.db import models
from django.utils import timezone
class ArticleManager(models.Manager):
def published(self):
qs = self.get_queryset()
return qs.filter(published_at=timezone.now())
class Article(models.Model):
title = models.CharField('Titre', max_length=100)
published_at = models.DateTimeField('Date et heure de publication', default=timezone.now)
objects = ArticleManager()
class ArticleView(ListView):
queryset = Article.objects.all()
#Fonctionne à chaque demande
def get_queryset(self):
qs = super(ArticleView, self).get_queryset()
return qs.published()
Ce n'est rien de plus qu'une simple «erreur de négligence», mais j'y suis accro sans rien remarquer d'autre (peut-être juste moi !!), alors faites attention.
Recommended Posts