前提・実現したいこと
DjangoでTodoアプリを作っています。
このアプリに通知機能を追加したいです。
具体的には、send_mailメソッドを使って決められた時刻の数分前になったら、GmailにTodoデータを送信したいです。
発生している問題・エラーメッセージ
viewとformを見てわかる通り現在時刻と自分で決める時刻それぞれのフォーマットを統一したにも関わらず、決められた時刻の一分前になってもGmailにデータが送信されません。(エラーは発生していません。)日にちで比較した場合にうまく送信されたので、メールを送るための記述は間違ってないと思います。なので時刻の比較もしくは時刻の取得方法が間違っていると思います。
該当のソースコード
view
1 nowtime = datetime.datetime.now().strftime('%Y-%m-%d %H:%M') 2 time = datetime.datetime.strptime(nowtime,'%Y-%m-%d %H:%M') 3 todo_obj = TodoModel.objects.all() 4 for obj in todo_obj: 5 if time == (obj.duedate - datetime.timedelta(minutes=1)): 6 subject = 'タイトル:{}'.format(obj.title) 7 massege = 'メモ:{}\n期日:{}\nカテゴリ:{}\n'.format(obj.memo,obj.duedate,obj.category) 8 from_mail = [] 9 recipient = [settings.EMAIL_HOST_USER] 10 send_mail(subject, massege, from_mail, recipient) 11
model
1from django.db import models 2from django.utils import timezone 3# Create your models here. 4class Category(models.Model): 5 class Meta: 6 db_table = "category" 7 verbose_name = "カテゴリ" 8 verbose_name_plural = "カテゴリ" 9 10 category_name = models.CharField(max_length=255,unique=True,verbose_name="カテゴリの名前",null=True) 11 12 def __str__(self): 13 return self.category_name 14 15PRIORITY = (('danger','high'),('info','normal'),('success','low')) 16class TodoModel(models.Model): 17 class Meta: 18 db_table = "todomodel" 19 verbose_name = "todoモデル" 20 verbose_name_plural = "todoモデル" 21 22 title = models.CharField(max_length=100,verbose_name="タイトル") 23 memo = models.TextField(verbose_name="メモ") 24 priority = models.CharField( 25 max_length = 50, 26 choices = PRIORITY, 27 verbose_name="優先度" 28 ) 29 duedate = models.DateTimeField(verbose_name="期日",default=timezone.now) 30 category = models.ForeignKey(Category,on_delete = models.PROTECT,verbose_name="カテゴリ",null=True) 31 def __str__(self): 32 return self.title
form
1from django import forms 2from .models import TodoModel 3 4 5class TodoForm(forms.ModelForm): 6 7 8 class Meta: 9 model = TodoModel 10 fields = '__all__' 11 widgets = { 12 'duedate':forms.DateTimeInput(attrs={'placeholder':'記入例:2020-12-25 23:20'},format='%Y-%m-%d %H:%M'), 13 } 14
試したこと
・現在時刻と決めた時刻を比較する場合、コンマ何秒でも違っていたらイコールにはならないと思い、strptimeやstrftime関数を使い書式を設定しました。
・↑のようにしてもダメだったのでtime = datetime.datetime.now()で現在時刻を取得しそのまま条件式に組み込みました。
・↑のようにしてもだめだったので、viewで
nowtime = datetime.datetime.now()
time = datetime.datetime.strptime(str(nowtime),'%Y-%m-%d %H:%M:%S.%f')
:
if time == (obj.duedate - datetime.timedelta(minutes=1)):
としました。
補足情報(FW/ツールのバージョンなど)
ここにより詳細な情報を記載してください。
・バージョン
Django:2.2.16
python:3.8.5
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/12/27 13:21
2020/12/27 23:03
2020/12/28 07:10