Могу ли я установить max_value в форме продаж amount_sold как свойство coins_remaining из вида транзакции? - PullRequest
0 голосов
/ 28 апреля 2019

Я создаю приложение криптовалюты.В моем приложении пользователь может иметь много транзакций, а транзакция может состоять из множества продаж.У меня есть форма для ввода продаж, и я пытаюсь поместить ограничение max_value, равное свойству (coins_remaining), в таблицу транзакций.Можно ли сделать это?Если да, то как мне поступить?

Форма продажи ниже

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 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)

1 Ответ

1 голос
/ 28 апреля 2019

Вы можете сделать это простым чистым методом.Но вам нужно будет передать транзакцию перед проверкой.

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...