取消发布django中特定日期的文章

时间:2010-07-03 14:00:03

标签: django

我有一个简单的文章模型,其中包含pub_date字段和unpublish_date字段。

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

4 个答案:

答案 0 :(得分: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)

看起来您需要创建一些将在某个时间间隔运行的预定作业,检查准备好取消发布的文章并取消发布。

对于这种情况,我会做以下事情:

  1. create custom manage.py command这将符合您的逻辑。在这种情况下,它将查找可以取消发布的文章,并将其标记更改为unpublished
  2. 设置cron以每X分钟/小时启动此命令
  3. 您还可以使用djnago-chronograph - 此应用有助于管理应用中的预定任务。

答案 2 :(得分: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))

答案 3 :(得分:0)

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

我使用精彩的django-template-utils在每个网页上显示应用。

如果我这样做:

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

我只获得了活动对象,但在那时他们也从管理员那里消失了。有谁知道是否有办法让django-templates-utils使用自定义的modelManager而不是标准的?或者有没有办法使用模型管理器在前端隐藏不活跃的帖子,但会在管理员中显示它们?