Отменить публикацию статьи на определенную дату в Django - PullRequest
2 голосов
/ 03 июля 2010

У меня есть простая модель статьи с полем pub_date и полем unpublish_date.

Есть ли какой-либо способ автоматически установить для моего поля is_published значение False, если unpublish_date уже был в прошлом?

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 ]

1 голос
/ 05 июля 2010

Вы можете просто включить это unpublish_date в свои запросы, например:

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

Это, вероятно, сделает ваш код более сложным.Вы должны были бы переписать все свои запросы, чтобы знать, что * Cron unpublish_date.

работает для такого рода вещей, но подходит только для изменения вещей большими партиями один или несколько раз в день.Он плохо масштабируется, когда вам нужно выполнить большой пакет задач или вам нужно более детальное планирование.

Если достаточно запустить задачу через 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))
1 голос
/ 03 июля 2010

Похоже, вам нужно создать какое-то запланированное задание, которое будет выполняться через определенный промежуток времени, проверить готовые статьи к публикации и отменить их публикацию.

Для таких случаев я делаю следующее:

  1. создайте собственную команду manage.py , которая будет выполнять вашу логику. В этом случае он будет искать статьи, которые могут быть не опубликованы, и поменять их флаг на unpublished
  2. настроить cron для запуска этой команды каждые X минут / часов

Вы также можете использовать djnago-хронограф - это приложение помогает управлять запланированными задачами в вашем приложении.

1 голос
/ 03 июля 2010

Я не думаю, что это возможно без небольшого количества пользовательского кода ... Но этот пользовательский код довольно прост:

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

(конечно, убедитесь, что вы делаете правильное преобразование часового пояса на self.unpublished_date, если это применимо ...)

0 голосов
/ 05 июля 2010

Использование фрагмента: http://djangosnippets.org/snippets/838/ решило большую часть моей проблемы! Но теперь я столкнулся с новой проблемой.

Я использую фантастические django-template-utils для отображения приложения на каждой веб-странице.

Если я сделаю это:

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

Я получаю только активные объекты, но затем они исчезают и у администратора. Кто-нибудь знает, есть ли какой-нибудь способ заставить django-templates-utils использовать пользовательский modelManager вместо стандартного? Или есть способ использовать менеджер моделей, который скрывает неактивные сообщения в интерфейсе, но отображает их в админке?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...