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.