比较 views.py 中的 timezone.now() 与 models.py 中的 DateTimeField
Comparing timezone.now() in views.py to DateTimeField in models.py
我想创建一个待办事项列表,我可以在其中安排每项任务的日期和时间。我的目标是在提供的 datetime
等于当前时间时获得某种响应。例如,我安排在周六晚上 6 点洗衣服。两天后(星期一下午 6 点)我想收到通知,我应该 洗衣服。
请注意,可以在第一行的 index() 函数 views.py 中找到关键思想,包括if 语句。
这是我的代码:
urls.py
from django.urls import path
from . import views
urlpatterns = [
path("", views.index, name="index"),
path("<int:aufgabenzettel_id>", views.details, name="details"),
path("add/", views.add, name="add"),
path("delete/<int:aufgabenzettel_id>", views.delete, name="delete"),
path("edit/<int:aufgabenzettel_id>", views.edit, name="edit"),
path("update/<int:aufgabenzettel_id>", views.update, name="update")
]
models.py
from django.db import models
# Create your models here.
class Aufgabenzettel(models.Model):
Aufgabeselbst = models.CharField(max_length=64)
Datum = models.DateTimeField(auto_now_add=True)
Geplant = models.DateTimeField(auto_now_add=False, auto_now=False)
def __str__(self):
return f"{self.Aufgabeselbst}"
views.py(重要部分可以在第一行的索引函数中找到,包括if语句)
from django.db.models.fields import DateTimeField
from django.http.response import HttpResponseRedirect
from django.shortcuts import render
from django.urls import reverse
from django.utils import timezone
from datetime import datetime
from .models import Aufgabenzettel
# Create your views here.
def index(request):
now = timezone.now()
Aufgaben_items = Aufgabenzettel.objects.all().order_by("-Geplant") #arrange objects in the correct order
for Aufgabenzettel.Geplant in Aufgaben_items: #run through the loop and...
if Aufgabenzettel.Geplant == now: #...search for items in the database where the scheduled time ("Geplant" from "Aufgabenzettel" in models.py) is equal to the current time
return render (request, "aufgabenzettel/add.html") #response in any way e.g. by returning the add.html
return render(request, "aufgabenzettel/index.html", {
"Aufgabenliste":Aufgabenzettel.objects.all(), #currently not used
"Aufgaben_items":Aufgaben_items
})
def details(request, aufgabenzettel_id):
aufgabenzettel = Aufgabenzettel.objects.get(pk=aufgabenzettel_id)
creationDate = aufgabenzettel.Datum
dueDate = aufgabenzettel.Geplant
return render(request, "aufgabenzettel/details.html", {
"details":aufgabenzettel,
"creationDate": creationDate,
"dueDate":dueDate
})
def add(request):
addDatum = timezone.now()
if request.method == "POST":
Aufgabe = request.POST["Hinzufügen"]
geplantes_datum = request.POST["DatumFeld"]
Aufgabenzettel.objects.create(Aufgabeselbst=Aufgabe , Datum=addDatum, Geplant=geplantes_datum) #Aufgabenname und Aufgabendatum erstellen
return HttpResponseRedirect(reverse("index"))
return render(request, "aufgabenzettel/add.html")
def delete(request, aufgabenzettel_id):
aufgabenzettel = Aufgabenzettel.objects.get(pk=aufgabenzettel_id)
aufgabenzettel.delete()
return HttpResponseRedirect(reverse("index"))
def edit(request, aufgabenzettel_id):
aufgabenzettel = Aufgabenzettel.objects.get(pk=aufgabenzettel_id)
return render(request, "aufgabenzettel/edit.html", {
"details":aufgabenzettel
})
def update(request, aufgabenzettel_id):
if request.method == "POST":
Aufgabe = Aufgabenzettel.objects.get(pk=aufgabenzettel_id)
Aufgabe.Aufgabeselbst = request.POST["Bearbeiten"]
Aufgabe.save()
return HttpResponseRedirect(reverse("index"))
return render(request, "aufgabenzettel/edit.html")
index.html
{% extends "aufgabenzettel/layout.html" %}
{% block body %}
<h1 id="MeineAufgaben">Meine Aufgaben</h1>
<table>
{% for Aufgabeselbst in Aufgaben_items %}
<tr>
<td>
<a href="{% url 'details' Aufgabeselbst.id %}">
{{ Aufgabeselbst }}
</a>
</td>
<td>
<form action="{% url 'delete' Aufgabeselbst.id %}" method="post">
{% csrf_token %}
<button type="submit" id="löschenbtn">Löschen</button>
</form>
</td>
<td>
<form action="{% url 'edit' Aufgabeselbst.id %}" method="post">
{% csrf_token %}
<button type="submit" value="{{ details }}" class="bearbeitenbtn">Bearbeiten</button>
</form>
</td>
</tr>
{% endfor %}
</table>
<h2>
<a href="{% url 'add' %}" id="neuebtn">Neue Aufgabe erstellen</a>
</h2>
{% endblock %}
add.html
{% extends "aufgabenzettel/layout.html" %}
{% block body %}
<h1>Füge eine neue Aufgabe hinzu!</h1>
<form action="{% url 'add' %}" method="post">
{% csrf_token %}
<input type="text" name="Hinzufügen" placeholder="Neue Aufgabe">
<input type="datetime-local" name="DatumFeld">
<button type="submit" id="Hinzufügen">Hinzufügen</button>
</form>
{% endblock %}
details.html
{% extends "aufgabenzettel/layout.html" %}
{% block body %}
<h1>{{ details }}</h1>
<h3>Erstellt: {{ creationDate }}</h3>
<h2>Geplant: {{ dueDate }}</h2>
<a href="{% url 'index' %}">Zurück zu Aufgabe</a>
{% endblock %}
edit.html
{% extends "aufgabenzettel/layout.html" %}
{% block body %}
<h2>Bearbeite deine Aufgabe "{{ details }}"</h2>
<form action="{% url 'update' details.id %}" method="post">
{% csrf_token %}
<input type="text" name="Bearbeiten" value="{{details}}">
<button type="submit" class="bearbeitenbtn">Bearbeiten</button>
</form>
<a href="{% url 'index' %}">Zurück zu Aufgabe</a>
{% endblock %}
layout.html
{% load static %}
<!DOCTYPE html>
<html lang="de">
<head>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Aufgabenzettel</title>
<link rel="stylesheet" href="{% static '/css/main.css' %}">
</head>
<body>
{% block body %}
{% endblock %}
</body>
</html>
我没有收到错误或任何错误,但代码与预期的不同 运行。我只希望索引函数循环遍历 Aufgabenzettel in models.py 中的每个元素,如果它检测到预定的元素time 对应于当前时间某种动作(在这种情况下重定向到 add.html 是预期的)应该发生。但是我没有得到任何这样的回应...
一如既往,我感谢各种解决方案或帮助!
您视图中的代码未被触发,因为日期时间具有微秒精度。
您可以通过多种方式解决这个问题。一种选择是检查过去一小时内是否发生了任何项目:
from datetime import timedelta
def index(request):
now = timezone.now()
in_the_past = now - timedelta(hours=1)
items_exist = Aufgabenzettel.objects.filter(
Geplant__gt=in_the_past,
Geplant__lt=now
).exists()
if items_exist
return render (request, "aufgabenzettel/add.html")
return render(request, "aufgabenzettel/index.html", {
"Aufgabenliste":Aufgabenzettel.objects.all(), #currently not used
"Aufgaben_items":Aufgaben_items
})
另一种选择可能涉及向模型添加新字段以指示任务何时完成:
class Aufgabenzettel(models.Model):
Aufgabeselbst = models.CharField(max_length=64)
Datum = models.DateTimeField(auto_now_add=True)
Geplant = models.DateTimeField(auto_now_add=False, auto_now=False)
is_complete = models.BooleanField(default=False)
然后您的视图可以更新为在过去发生但尚未标记的任务时触发:
def index(request):
now = timezone.now()
items_exist = Aufgabenzettel.objects.filter(
is_complete=False,
Geplant__lt=now
).exists()
if items_exist
return render (request, "aufgabenzettel/add.html")
return render(request, "aufgabenzettel/index.html", {
"Aufgabenliste":Aufgabenzettel.objects.all(), #currently not used
"Aufgaben_items":Aufgaben_items
})
定期检查条件的最简单方法是让您的浏览器自动重新加载页面。您可以通过将以下标记添加到模板的 <head>
部分来执行此操作:
<meta http-equiv="refresh" content="120">
我想创建一个待办事项列表,我可以在其中安排每项任务的日期和时间。我的目标是在提供的 datetime
等于当前时间时获得某种响应。例如,我安排在周六晚上 6 点洗衣服。两天后(星期一下午 6 点)我想收到通知,我应该 洗衣服。
请注意,可以在第一行的 index() 函数 views.py 中找到关键思想,包括if 语句。
这是我的代码: urls.py
from django.urls import path
from . import views
urlpatterns = [
path("", views.index, name="index"),
path("<int:aufgabenzettel_id>", views.details, name="details"),
path("add/", views.add, name="add"),
path("delete/<int:aufgabenzettel_id>", views.delete, name="delete"),
path("edit/<int:aufgabenzettel_id>", views.edit, name="edit"),
path("update/<int:aufgabenzettel_id>", views.update, name="update")
]
models.py
from django.db import models
# Create your models here.
class Aufgabenzettel(models.Model):
Aufgabeselbst = models.CharField(max_length=64)
Datum = models.DateTimeField(auto_now_add=True)
Geplant = models.DateTimeField(auto_now_add=False, auto_now=False)
def __str__(self):
return f"{self.Aufgabeselbst}"
views.py(重要部分可以在第一行的索引函数中找到,包括if语句)
from django.db.models.fields import DateTimeField
from django.http.response import HttpResponseRedirect
from django.shortcuts import render
from django.urls import reverse
from django.utils import timezone
from datetime import datetime
from .models import Aufgabenzettel
# Create your views here.
def index(request):
now = timezone.now()
Aufgaben_items = Aufgabenzettel.objects.all().order_by("-Geplant") #arrange objects in the correct order
for Aufgabenzettel.Geplant in Aufgaben_items: #run through the loop and...
if Aufgabenzettel.Geplant == now: #...search for items in the database where the scheduled time ("Geplant" from "Aufgabenzettel" in models.py) is equal to the current time
return render (request, "aufgabenzettel/add.html") #response in any way e.g. by returning the add.html
return render(request, "aufgabenzettel/index.html", {
"Aufgabenliste":Aufgabenzettel.objects.all(), #currently not used
"Aufgaben_items":Aufgaben_items
})
def details(request, aufgabenzettel_id):
aufgabenzettel = Aufgabenzettel.objects.get(pk=aufgabenzettel_id)
creationDate = aufgabenzettel.Datum
dueDate = aufgabenzettel.Geplant
return render(request, "aufgabenzettel/details.html", {
"details":aufgabenzettel,
"creationDate": creationDate,
"dueDate":dueDate
})
def add(request):
addDatum = timezone.now()
if request.method == "POST":
Aufgabe = request.POST["Hinzufügen"]
geplantes_datum = request.POST["DatumFeld"]
Aufgabenzettel.objects.create(Aufgabeselbst=Aufgabe , Datum=addDatum, Geplant=geplantes_datum) #Aufgabenname und Aufgabendatum erstellen
return HttpResponseRedirect(reverse("index"))
return render(request, "aufgabenzettel/add.html")
def delete(request, aufgabenzettel_id):
aufgabenzettel = Aufgabenzettel.objects.get(pk=aufgabenzettel_id)
aufgabenzettel.delete()
return HttpResponseRedirect(reverse("index"))
def edit(request, aufgabenzettel_id):
aufgabenzettel = Aufgabenzettel.objects.get(pk=aufgabenzettel_id)
return render(request, "aufgabenzettel/edit.html", {
"details":aufgabenzettel
})
def update(request, aufgabenzettel_id):
if request.method == "POST":
Aufgabe = Aufgabenzettel.objects.get(pk=aufgabenzettel_id)
Aufgabe.Aufgabeselbst = request.POST["Bearbeiten"]
Aufgabe.save()
return HttpResponseRedirect(reverse("index"))
return render(request, "aufgabenzettel/edit.html")
index.html
{% extends "aufgabenzettel/layout.html" %}
{% block body %}
<h1 id="MeineAufgaben">Meine Aufgaben</h1>
<table>
{% for Aufgabeselbst in Aufgaben_items %}
<tr>
<td>
<a href="{% url 'details' Aufgabeselbst.id %}">
{{ Aufgabeselbst }}
</a>
</td>
<td>
<form action="{% url 'delete' Aufgabeselbst.id %}" method="post">
{% csrf_token %}
<button type="submit" id="löschenbtn">Löschen</button>
</form>
</td>
<td>
<form action="{% url 'edit' Aufgabeselbst.id %}" method="post">
{% csrf_token %}
<button type="submit" value="{{ details }}" class="bearbeitenbtn">Bearbeiten</button>
</form>
</td>
</tr>
{% endfor %}
</table>
<h2>
<a href="{% url 'add' %}" id="neuebtn">Neue Aufgabe erstellen</a>
</h2>
{% endblock %}
add.html
{% extends "aufgabenzettel/layout.html" %}
{% block body %}
<h1>Füge eine neue Aufgabe hinzu!</h1>
<form action="{% url 'add' %}" method="post">
{% csrf_token %}
<input type="text" name="Hinzufügen" placeholder="Neue Aufgabe">
<input type="datetime-local" name="DatumFeld">
<button type="submit" id="Hinzufügen">Hinzufügen</button>
</form>
{% endblock %}
details.html
{% extends "aufgabenzettel/layout.html" %}
{% block body %}
<h1>{{ details }}</h1>
<h3>Erstellt: {{ creationDate }}</h3>
<h2>Geplant: {{ dueDate }}</h2>
<a href="{% url 'index' %}">Zurück zu Aufgabe</a>
{% endblock %}
edit.html
{% extends "aufgabenzettel/layout.html" %}
{% block body %}
<h2>Bearbeite deine Aufgabe "{{ details }}"</h2>
<form action="{% url 'update' details.id %}" method="post">
{% csrf_token %}
<input type="text" name="Bearbeiten" value="{{details}}">
<button type="submit" class="bearbeitenbtn">Bearbeiten</button>
</form>
<a href="{% url 'index' %}">Zurück zu Aufgabe</a>
{% endblock %}
layout.html
{% load static %}
<!DOCTYPE html>
<html lang="de">
<head>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Aufgabenzettel</title>
<link rel="stylesheet" href="{% static '/css/main.css' %}">
</head>
<body>
{% block body %}
{% endblock %}
</body>
</html>
我没有收到错误或任何错误,但代码与预期的不同 运行。我只希望索引函数循环遍历 Aufgabenzettel in models.py 中的每个元素,如果它检测到预定的元素time 对应于当前时间某种动作(在这种情况下重定向到 add.html 是预期的)应该发生。但是我没有得到任何这样的回应...
一如既往,我感谢各种解决方案或帮助!
您视图中的代码未被触发,因为日期时间具有微秒精度。
您可以通过多种方式解决这个问题。一种选择是检查过去一小时内是否发生了任何项目:
from datetime import timedelta
def index(request):
now = timezone.now()
in_the_past = now - timedelta(hours=1)
items_exist = Aufgabenzettel.objects.filter(
Geplant__gt=in_the_past,
Geplant__lt=now
).exists()
if items_exist
return render (request, "aufgabenzettel/add.html")
return render(request, "aufgabenzettel/index.html", {
"Aufgabenliste":Aufgabenzettel.objects.all(), #currently not used
"Aufgaben_items":Aufgaben_items
})
另一种选择可能涉及向模型添加新字段以指示任务何时完成:
class Aufgabenzettel(models.Model):
Aufgabeselbst = models.CharField(max_length=64)
Datum = models.DateTimeField(auto_now_add=True)
Geplant = models.DateTimeField(auto_now_add=False, auto_now=False)
is_complete = models.BooleanField(default=False)
然后您的视图可以更新为在过去发生但尚未标记的任务时触发:
def index(request):
now = timezone.now()
items_exist = Aufgabenzettel.objects.filter(
is_complete=False,
Geplant__lt=now
).exists()
if items_exist
return render (request, "aufgabenzettel/add.html")
return render(request, "aufgabenzettel/index.html", {
"Aufgabenliste":Aufgabenzettel.objects.all(), #currently not used
"Aufgaben_items":Aufgaben_items
})
定期检查条件的最简单方法是让您的浏览器自动重新加载页面。您可以通过将以下标记添加到模板的 <head>
部分来执行此操作:
<meta http-equiv="refresh" content="120">