2010-07-03 35 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,而不是標準的嗎?或者有沒有辦法使用模型管理器,在前端隱藏未激活的帖子,但會在管理員中顯示它們?