Django - Форма, перечисляющая поля для каждого внешнего ключа

У меня есть 2 модели:

class AccountsPlan (models.Model):

code = models.CharField(max_length=7, unique=True)
name = models.CharField(max_length=100, unique=True)
active = models.BooleanField(default=True)

class Planning (models.Model):

accountplan = models.ForeignKey(AccountsPlan, on_delete=models.PROTECT, limit_choices_to={'active': True})
month = models.DateField()
amount = models.DecimalField(max_digits=14, decimal_places=2)

Эта форма:

class PlanningForm(forms.ModelForm):

accountplan = ModelChoiceField(queryset=AccountsPlan.objects.filter(active=True).order_by('code'))
month = forms.DateField(required=True)
amount = forms.DecimalField(max_digits=14, decimal_places=2, required=True, localize=True)

class Meta:
    model = Planning
    fields = '__all__'

А это мнение:

def new_planning(request):
if request.method == 'POST':
    form = PlanningForm(request.POST)
    if form.is_valid():
        form.save()
else:
    form = PlanningForm()

return render(request, 'app/pages/planning/new_planning.html', context={
    'form': form,
})

Форма работает как задумано, но сейчас у меня более 100 записей в модели AccountsPlan и со временем это число будет увеличиваться. Пользователю необходимо заполнять PlanningForm каждый месяц для каждого внешнего ключа в модели AccountsPlan, поэтому заполнение по одному не является идеальным вариантом.

Поскольку поле month будет одинаковым для каждого внешнего ключа и только поле amount отличается, я пытаюсь сделать следующее:

В форме перечислены все внешние ключи с полем amount для каждого из них и единственным полем month. Пользователь выбирает дату, вводит только сумму и сохраняет данные.

Я попробовал этот ответ и мне удалось сделать так, чтобы форма выглядела именно так, как я описал. Я могу показать только одно поле для месяца и создать десятичное поле для суммы, которое зацикливается для каждого внешнего ключа, но у меня проблемы с сохранением данных.

Обновленная форма, основанная на упомянутом ответе:

class PlanningForm(forms.ModelForm):

accountplans = AccountsPlan.objects.all()
month = forms.DateField(required=True,widget=forms.DateInput(format=('%Y-%m-%d'),
        attrs={
            'type': 'date',
            'value': date.today() + relativedelta.relativedelta(months=1), }),
)

def __init__(self, *args, **kwargs):
    super(PlanningForm, self).__init__(*args, **kwargs)
    for accountplan in self.accountplans:
        self.fields[accountplan.name] = forms.DecimalField(
            max_digits=14,
            decimal_places=2,
            required=True,
            widget=forms.NumberInput(attrs={'value': 0, })
        )

class Meta:
    model = Planning
    fields = ['month', ]

Насколько я понимаю, я должен переопределить метод сохранения, но каждая попытка, основанная на ответе, показывает мне другую ошибку. Как я могу сохранить эти данные? Есть ли другой способ добиться нужного мне поведения? Буду признателен за помощь.

Вернуться на верх