2010-07-03 67 views
2

我有一个简单的文章模型,其中包含pub_date字段和unpublish_date字段。在django的特定日期取消发布文章

当unpublish_date过去时,有没有办法自动将我的is_published字段设置为False?

class Article(models.Model): 
    title = models.CharField(max_length=500) 
    post = models.TextField(blank=True, null=True,) 

    pub_date = models.DateTimeField(default=datetime.datetime.now) 
    unpublish_date = models.DateTimeField(blank=True, null=True) 
    is_published = models.BooleanField(default=True,) 

回答

1

你可以简单地考虑此因素unpublish_date到您的查询,例如:

articles_to_show = Articles.objects.filter(is_published=True, 
             unpublish_date__gt=datetime.date.today()) 

这很可能使你的代码变得更加复杂,虽然。您必须重写所有查询以了解unpublish_date

的Cron适用于这样的事情,但仅仅是改变大批量的东西或一天几次一次好。当您需要执行大量任务或需要更细粒度的调度时,它不能很好地扩展。

如果每天通过cron运行一次任务就足够了,那就这样做。不过,可能需要研究更高级的选项,例如消息队列。

为了使计划任务将在精确的时间(提供工人可用),我会用Celery运行。

from celery.decorators import task 

@task 
def unpublish(article_pk): 
    article = Article.objects.get(pk=article_pk) 
    article.is_published = False 
    article.save() 

# Unpublish article in exactly 7 days from now 
from datetime import datetime, timedelta 
unpublish.apply_async([article.pk], eta=datetime.now() + datetime.timedelta(7)) 
+0

谢谢,这个伎俩! – Anthrax00 2010-07-07 19:17:22

1

我不认为这是可能没有一点的自定义代码......但是,自定义代码很简单:

def save(self, *args, **kwargs): 
    if self.unpublished_date < datetime.now(): 
     self.is_published = True 
    super(Article, self).save(*args, **kwargs) 

(当然,要确保你正在做正确的时区转换在self.unpublished_date,如果适用...)

1

它看起来像你需要创建一些计划的作业,将运行在一定的时间间隔,检查文章准备好取消发布,并取消发布它们。

对于这样的情况我下面的事情:

  1. create custom manage.py command,会做你的逻辑。在这种情况下,它会寻找物品,可以是未发表的,改变他们的标志unpublished
  2. 设立cron推出此命令每隔X分钟/小时

您还可以使用djnago-chronograph - 这个程序可以帮助管理应用程序中的计划任务。

0

使用片段:http://djangosnippets.org/snippets/838/解决了我的大部分问题!但是现在我遇到了一个新问题。

我使用奇妙的django-template-utils来显示每个网页上的应用程序。

如果我这样做:

objects = ActiveManager(from_date='pub_date', to_date='unpublish_date') 

我只得到了活动对象,但在随后,他们从管理disapear也。有谁知道是否有某种方法可以让django-templates-utils使用自定义modelManager,而不是标准的吗?或者有没有办法使用模型管理器,在前端隐藏未激活的帖子,但会在管理员中显示它们?