Я использую здесь пример кода, чтобы представить проблему, поэтому, пожалуйста, извините за любые ошибки и, пожалуйста, не попадитесь на архитектуру. Цель состоит в том, чтобы позволить пользователям вводить разделенные платежи в мое приложение по учету расходов. Представьте, что вы посещаете супермаркет и используете свою кредитную карту, чтобы купить еду за 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')