Django 我是否可以将销售表单amount\u Saled中的最大值设置为交易视图中剩余的财产?
我正在创建一个加密货币应用程序。在我的应用程序中,一个用户可以有许多交易,一个交易可以包含许多销售。我有一个输入销售的表单,我试图将max_值约束设置为交易表中的一个属性(coins_剩余)。有可能这样做吗?如果是的话,我该怎么做 销售表格如下Django 我是否可以将销售表单amount\u Saled中的最大值设置为交易视图中剩余的财产?,django,database,forms,constraints,Django,Database,Forms,Constraints,我正在创建一个加密货币应用程序。在我的应用程序中,一个用户可以有许多交易,一个交易可以包含许多销售。我有一个输入销售的表单,我试图将max_值约束设置为交易表中的一个属性(coins_剩余)。有可能这样做吗?如果是的话,我该怎么做 销售表格如下 class SaleForm(forms.ModelForm): amount_sold = forms.IntegerField(min_value=0.1, label='Enter number of coins sold ',
class SaleForm(forms.ModelForm):
amount_sold = forms.IntegerField(min_value=0.1, label='Enter number of coins sold ',
error_messages={'min_value': 'You must enter some coins '}
)
total_price_sold = forms.DecimalField()
date_sold = forms.DateField(
label='Enter Date of Sale ',
help_text='Please use calendar by clicking arrow on the right ',
widget=forms.TextInput(
attrs={'type': 'date'}
)
)
note = forms.CharField(label='Write a note below ',
widget=forms.TextInput(attrs={'placeholder': 'Keep a Note? '}))
class Meta:
model = Sale
fields = ('date_sold', 'amount_sold', 'total_price_sold', 'note')
交易模型如下
class Transaction(models.Model):
currency = models.CharField(max_length=20)
amount = models.IntegerField()
total_price = models.DecimalField(max_digits=8, decimal_places=2)
date_purchased = models.DateTimeField()
note = models.TextField(default="")
owner = models.ForeignKey(User, on_delete=models.CASCADE)
amount_per_coin = models.DecimalField(max_digits=8, decimal_places=2, editable=False)
def save(self, *args, **kwargs):
self.amount_per_coin = self.total_price / self.amount
super(Transaction, self).save(*args, **kwargs)
def __str__(self):
return str(self.pk)+','+self.currency + ', '+str(self.amount)
def get_absolute_url(self):
return reverse('transaction-detail', kwargs={'pk': self.pk})
@property
def coins_remaining(self):
return self.amount - sum(self.sales.all().values_list('amount_sold', flat=True))
class Sale(models.Model):
amount_sold = models.IntegerField()
total_price_sold = models.DecimalField(max_digits=8, decimal_places=2)
date_sold = models.DateTimeField(default=timezone.now)
note = models.TextField(default="")
transaction = models.ForeignKey(Transaction, on_delete=models.CASCADE, related_name="sales")
amount_per_coin_sold = models.DecimalField(max_digits=8, decimal_places=2, editable=False)
def __str__(self):
return str(self.pk)+','+str(self.amount_sold) + ', '+self.note
def save(self, *args, **kwargs):
self.amount_per_coin_sold = self.total_price_sold / self.amount_sold
super(Sale, self).save(*args, **kwargs)
def get_absolute_url(self):
return reverse('sale-detail', kwargs={'pk': self.pk})
销售模式如下
class Transaction(models.Model):
currency = models.CharField(max_length=20)
amount = models.IntegerField()
total_price = models.DecimalField(max_digits=8, decimal_places=2)
date_purchased = models.DateTimeField()
note = models.TextField(default="")
owner = models.ForeignKey(User, on_delete=models.CASCADE)
amount_per_coin = models.DecimalField(max_digits=8, decimal_places=2, editable=False)
def save(self, *args, **kwargs):
self.amount_per_coin = self.total_price / self.amount
super(Transaction, self).save(*args, **kwargs)
def __str__(self):
return str(self.pk)+','+self.currency + ', '+str(self.amount)
def get_absolute_url(self):
return reverse('transaction-detail', kwargs={'pk': self.pk})
@property
def coins_remaining(self):
return self.amount - sum(self.sales.all().values_list('amount_sold', flat=True))
class Sale(models.Model):
amount_sold = models.IntegerField()
total_price_sold = models.DecimalField(max_digits=8, decimal_places=2)
date_sold = models.DateTimeField(default=timezone.now)
note = models.TextField(default="")
transaction = models.ForeignKey(Transaction, on_delete=models.CASCADE, related_name="sales")
amount_per_coin_sold = models.DecimalField(max_digits=8, decimal_places=2, editable=False)
def __str__(self):
return str(self.pk)+','+str(self.amount_sold) + ', '+self.note
def save(self, *args, **kwargs):
self.amount_per_coin_sold = self.total_price_sold / self.amount_sold
super(Sale, self).save(*args, **kwargs)
def get_absolute_url(self):
return reverse('sale-detail', kwargs={'pk': self.pk})
下面的函数
class SaleCreateView(LoginRequiredMixin, CreateView):
form_class = SaleForm
template_name = "webapp/sale_form.html"
def dispatch(self, request, *args, **kwargs):
self.transaction = get_object_or_404(Transaction, pk=kwargs['pk'])
return super().dispatch(request, *args, **kwargs)
def form_valid(self, form):
form.instance.transaction = self.transaction
return super().form_valid(form)
你可以用一个简单的清理方法来完成。但您需要在验证之前传入事务
class SaleForm(forms.ModelForm):
...
def __init__(self, *args, **kwargs):
self.transaction = kwargs.pop('transaction')
super().__init__(*args, **kwargs)
def clean_amount_sold(self):
amount = self.cleaned_data['amount_sold']
remaining = self.transaction.coins_remaining
if amount > remaining:
raise forms.ValidationError('You only have {} coins remaining'.format(remaining))
return amount
class SaleCreateView(LoginRequiredMixin, CreateView):
...
def get_form_kwargs(self):
kwargs = super().get_form_kwargs()
kwargs['transaction'] = self.transaction
return kwargs