Проверка формы через родительскую форму и набор форм - PullRequest
1 голос
/ 25 января 2020

Я использую здесь пример кода, чтобы представить проблему, поэтому, пожалуйста, извините за любые ошибки и, пожалуйста, не попадитесь на архитектуру. Цель состоит в том, чтобы позволить пользователям вводить разделенные платежи в мое приложение по учету расходов. Представьте, что вы посещаете супермаркет и используете свою кредитную карту, чтобы купить еду за 20 фунтов и пару джинсов за 15 фунтов. Это будет введено как 35 фунтов стерлингов, разделенных на две категории: еда и одежда.

В моем проекте используется двойной учет, поэтому система будет регистрировать это как одну запись с тремя дочерними позициями: 35 фунтов из книги учета кредитных карт, £ 20 в книгу покупок и £ 15 в книгу покупок.

Мои вопросы: 1. Как выполнить проверку в родительской форме и наборе форм, чтобы убедиться, что введенная сумма в родительской форме равна сумме сумм, введенных в форму? 2. Должен ли я использовать formset_factory () или inlineformset_factory () в представлении при создании новой записи? А при создании вида редактирования?

models.py:

class Ledger(models.Model):
    name = models.CharField(max_length=255)
    LEDGER_TYPE_CHOICES = (
        ('AC', 'Account'),
        ('EX', 'Expense'),
    )
    type = models.CharField(
        max_length=2,
        choices=ENRTY_TYPE_CHOICES,
        blank=False,
        null=False,
        default='0'
        )

class Entry(models.Model):
    date = models.DateField(null=False, blank=False)
    ENTRY_TYPE_CHOICES = (
        ('BP', 'Bank Payment'),
        ('BR', 'Bank Receipt'),
        ('TR', 'Transfer'),
        ('SP', 'Split Payment'),
    )
    type = models.CharField(
        max_length=2,
        choices=ENRTY_TYPE_CHOICES,
        blank=False,
        null=False,
        default='0'
        )
    description = models.CharField(max_length=255, null=True, blank=True)

class LineItem(models.Model):
    entry = models.ForeignKey(JournalEntry, on_delete=models.CASCADE)
    ledger = models.ForeignKey(Ledger, on_delete=models.PROTECT)
    description = models.CharField(max_length=255, null=True, blank=True)
    amount = models.DecimalField(max_digits=8, decimal_places=2, null=True, blank=True)

Forms.py

class SplitPaymentForm(forms.Form):
    date = forms.DateField(widget=DateTypeInput())
    account = ModelChoiceField(queryset=Ledger.objects.filter(type='AC'))
    store = forms.CharField(required=True)
    amount = forms.DecimalField(decimal_places=2)

class SplitPaymentLineItemForm(ModelForm):
    ledger = ModelChoiceField(queryset=Ledger.objects.filter(type='EX'))
    project = forms.ModelChoiceField(queryset=Project.objects.filter(status=0), empty_label="Project", required=False)
    amount = forms.DecimalField(decimal_places=2)

Views.py

def split_payments_new(request):
    LineItemFormSet = inlineformset_factory(Entry, LineItem, form=SplitPaymentLineItemForm, extra=2)
    if request.method == 'POST':
        form = SplitPaymentForm(request.POST)
        lineitem_formset = LineItemFormSet(request.POST)
        if form.is_valid() and lineitem_formset.is_valid():
            # Some business logic will go here. Haven't done it yet...
            messages.success(request, "Split Payment successfully created.")
            #return HttpResponseRedirect(reverse('journal:split_payments_show_all'))
    else:
        form = SplitPaymentForm(initial = {'date': datetime.date.today().strftime('%Y-%m-%d')})
        lineitem_formset = LineItemFormSet()
    return render(request, 'journal/split_payments_new.html')

...