【问题标题】:Django timezone.now() returning NoneDjango timezone.now() 返回无
【发布时间】:2021-08-25 00:22:01
【问题描述】:

我知道我可以使用 auto_now_add 等于 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 函数。然而,尽管我的时区设置为美国/温哥华,但它提供了 UTC 时间。

【问题讨论】:

    标签: python django-models django-views django-forms django-timezone


    【解决方案1】:

    你需要更新使用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

    【讨论】:

    • 非常感谢,成功了!尽管设置了时区,但您也不会碰巧知道为什么时区不正确,对吧?
    • 别担心!您在哪里/如何设置时区?
    • 我在设置中输入了“TIME_ZONE='America/Vancouver'”和“USE_TZ=True”
    • 你现在得到的时区是什么?您是否有任何可能根据请求更改时区的中间件?
    • 我没有使用任何我知道的中间件;大多数设置只是默认设置,但无论如何我都会得到 UTC 时间。我还尝试将时区更改为“美国/太平洋”,我注意到它可以通过管理员直接工作,但不能通过 django 表单。
    猜你喜欢
    • 2021-01-29
    • 1970-01-01
    • 1970-01-01
    • 2012-06-02
    • 1970-01-01
    • 2021-10-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多