10

ユーザーがイベントを作成し、イベントが発生する日付を指定する小さなアプリを作成しています。イベントの日付が過ぎたら、そのイベント インスタンスを削除したいと考えています。私の現在の試みは、イベントページビューでイベントが期限切れになるかどうかをチェックする関数をスローしています。expire_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 に答える