10

我正在编写一个小应用程序,用户在其中创建一个事件并指定该事件发生的日期。事件日期过去后,我想删除该事件实例。我目前的尝试是抛出一个函数来检查事件是否应该在事件页面视图中过期。我不确定expiration_check 函数是否以正确的方式进行检查,也不确定仅在视图中有一个函数是否会起作用。

这是我的视图和过期功能:

def event_page(request, name):
    event = Event.objects.get(name=name)

    check_expiration(event)

    if request.method == "POST":
        form = GuestForm(request.POST)
        if form.is_valid():
            Guest = form.save(commit=False)
            Guest.event = event
            Guest.save()
            return redirect(event)
    else:
        form = GuestForm()
        return render(request, "event_page.html", {"form": form, "event": event, })


def check_expiration(event):
    now = datetime.datetime.now()

    if event.date < now: #if the event date has past
        event.delete()

我从用户那里收集日期并将其存储在 DateTime 字段中: date = models.DateField()

让我知道是否需要任何进一步的细节。任何见解表示赞赏,谢谢!

4

1 回答 1

18

如果您将应用程序托管在 UNIX 平台(GNU/Linux、OSX)上,最好使用cron通用系统实用程序来定期运行。

这需要将您的到期代码实现为自定义管理命令

  1. 如果您还没有任何自定义管理命令,请创建以下目录结构:

    yourapp/
      management/
         __init__.py (blank)
         commands/
           __init__.py (blank)
           expire_events.py
    
  2. expire_events.py中,按照以下方式创建一个新类:

    from django.core.management.base import NoArgsCommand
    
    class Command(NoArgsCommand):
    
        help = 'Expires event objects which are out-of-date'
    
        def handle_noargs(self):
            print Event.objects.filter(date__lt=datetime.datetime.now()).delete()
    
  3. 现在您应该能够运行./manage.py expire_events并删除任何过期日期为过去的事件。

cron要使用(这些说明适用于 GNU/Linux,但可能适用于其他 UNIX 变体)定期运行它,请运行sudo crontab -e并添加以下行:

*/5 * * * * /path/to/your/django/app/manage.py expire_events

(这将每 5 分钟运行一次任务;有关指定作业运行时间的建议,请参阅crontab 文档)

于 2012-08-03T04:08:32.557 回答