Django timezone.now() 返回 None
Django timezone.now() returning None
我知道我可以使用 auto_now_add equals True 但它让我烦恼,我无法让这个简单的视图起作用。
视图如下:
def create(request):
if request.method == "POST":
form = CreateListing(request.POST)
if form.is_valid:
form.save(commit=False)
form.date = timezone.now()
form.save()
return HttpResponseRedirect(reverse("index"))
else:
form = CreateListing()
return render(request, "auctions/create.html", {
"form": form
})
表格如下:
class CreateListing(forms.ModelForm):
class Meta:
model = Listing
fields = ("name", "description", "bid")
这是模型:
class Listing(models.Model):
name = models.CharField(max_length=50)
description = models.TextField()
bid = models.DecimalField(max_digits=8, decimal_places=2)
date = models.DateTimeField(null=True, blank=True)
#date = models.DateTimeField(auto_now_add=True)
def place(self):
self.date = timezone.now()
self.save()
def __str__(self):
return f"{self.name} going for {self.bid} since {self.date}"
我试过从模型中删除 place 函数,删除
form.save(commit=False)
并使用日期时间而不是时区。我在这上面浪费了太多时间,请帮忙!
唯一能让我工作的方法是通过 shell 创建一个对象并在那里使用 place 函数。但是,尽管我的时区设置为 America/Vancouver,但它给出的是 UTC 时间。
您需要更新使用 commit=False
时返回的实例,而不是表单,因此:
if form.is_valid:
instance = form.save(commit=False)
instance.date = timezone.now()
instance.save()
或者由于您在模型中编写了 place
方法:
if form.is_valid:
instance = form.save(commit=False)
instance.place()
虽然 place()
可能可以重命名为更好的名称?但我建议只使用 auto_now_add
.
我知道我可以使用 auto_now_add equals True 但它让我烦恼,我无法让这个简单的视图起作用。
视图如下:
def create(request):
if request.method == "POST":
form = CreateListing(request.POST)
if form.is_valid:
form.save(commit=False)
form.date = timezone.now()
form.save()
return HttpResponseRedirect(reverse("index"))
else:
form = CreateListing()
return render(request, "auctions/create.html", {
"form": form
})
表格如下:
class CreateListing(forms.ModelForm):
class Meta:
model = Listing
fields = ("name", "description", "bid")
这是模型:
class Listing(models.Model):
name = models.CharField(max_length=50)
description = models.TextField()
bid = models.DecimalField(max_digits=8, decimal_places=2)
date = models.DateTimeField(null=True, blank=True)
#date = models.DateTimeField(auto_now_add=True)
def place(self):
self.date = timezone.now()
self.save()
def __str__(self):
return f"{self.name} going for {self.bid} since {self.date}"
我试过从模型中删除 place 函数,删除
form.save(commit=False)
并使用日期时间而不是时区。我在这上面浪费了太多时间,请帮忙!
唯一能让我工作的方法是通过 shell 创建一个对象并在那里使用 place 函数。但是,尽管我的时区设置为 America/Vancouver,但它给出的是 UTC 时间。
您需要更新使用 commit=False
时返回的实例,而不是表单,因此:
if form.is_valid:
instance = form.save(commit=False)
instance.date = timezone.now()
instance.save()
或者由于您在模型中编写了 place
方法:
if form.is_valid:
instance = form.save(commit=False)
instance.place()
虽然 place()
可能可以重命名为更好的名称?但我建议只使用 auto_now_add
.