我正在建立一个拍卖网站,我希望清单上的最高出价为> = start_price,然后如果用户尝试输入bid_input 我认为我可能已经解决了如何使用clean(self)来验证bid_input的方法,但是我不确定如何将maximum_bid默认值设置为大于或等于start_price。保存时应该在模型上还是在表单上完成?我对如何真正做到这一点感到很困惑。 models.py forms.py class Listing(models.Model):
class NewManager(models.Manager):
def get_queryset(self):
return super().get_queryset().filter(status='active')
options = (
('active', 'Active'),
('closed', 'Closed'),
)
title = models.CharField(max_length=64)
description = models.TextField(max_length=64)
start_price = models.DecimalField(max_digits=9, decimal_places=2, validators=[MinValueValidator(0.99)])
image = models.URLField(max_length=200, blank=True)
category = models.ForeignKey(Category, on_delete=models.CASCADE, related_name="listings")
lister = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, default=None, null=True, blank=True)
date_added = models.DateTimeField(default=timezone.now)
highest_bid = models.DecimalField(max_digits=9, decimal_places=2, default=None)
status = models.CharField(max_length=10, choices=options, default="active")
favourites = models.ManyToManyField(User, related_name="favourite", default=None, blank=True)
objects = models.Manager()
listingmanager = NewManager()
def __str__(self):
return f"{self.title} ({self.pk}, £{self.start_price}, {self.lister})"
class Bid(models.Model):
bidder_user = models.ForeignKey(User, on_delete=models.CASCADE, related_name="bidders")
bid_item = models.ManyToManyField(Listing, related_name="bid_items", default=None)
bid_input = models.DecimalField(max_digits=9, decimal_places=2, default=None)
time= models.DateTimeField(default=timezone.now)
def __str__(self):
return f"Bid amount: {self.bid_input}"
class NewListingForm(forms.ModelForm):
class Meta:
model = Listing
fields = ["title", "description", "start_price", "image", "category", "highest_bid"]
title = forms.CharField(widget=forms.TextInput(attrs={'autocomplete':'off'}))
description = forms.CharField(widget=forms.TextInput(attrs={'autocomplete':'off'}))
start_price = forms.DecimalField(label='Starting Bid Price (£)')
image = forms.URLField(widget=forms.URLInput(attrs={'autocomplete':'off'}))
highest_bid = forms.DecimalField(required=False, widget=forms.HiddenInput())
class BidForm(forms.ModelForm):
class Meta:
model = Bid
fields = ["bid_input"]
labels = {"bid_input": ""}
widgets = {
"bid_input": forms.NumberInput(attrs={'placeholder': 'Enter bid (£)'})
}