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', ]
Насколько я понимаю, я должен переопределить метод сохранения, но каждая попытка, основанная на ответе, показывает мне другую ошибку. Как я могу сохранить эти данные? Есть ли другой способ добиться нужного мне поведения? Буду признателен за помощь.