1

我知道我可以使用 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 时间。

4

1 回答 1

0

您需要更新使用时返回的实例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.

于 2021-08-25T00:50:08.650 回答