Создание модели на основе экземпляров другой модели с помощью наборов форм
это мой первый вопрос здесь!
Итак, я пытаюсь сделать таблицу с неоплаченными счетами (модель начислений) и полями формы для модели оплаты. Модель оплаты должна иметь такие же экземпляры как сумма, пациент, пользователь и быть связанной с этой моделью начислений. Я хочу сделать таблицу с набором форм, где я могу видеть неоплаченные счета и отмечать оплаченные счета, а затем только отправлять их. Проблема в том, что я должен использовать два цикла для неоплаченных счетов и полей набора форм для отображения их в таблице. Я сделал шаблон с полями формы в каждой строке и это неудобно перезагружать страницу после отправки. И не получается сделать связь между начислением и оплатой. Вот код:
Итак, вот models.py
class Accrual(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE,
related_name='accruals')
date = models.DateField(db_index=True)
amount = models.DecimalField(decimal_places=2, max_digits=10)
payment = models.ManyToManyField(to='Payment', related_name='accruals',
blank=True)
info = models.CharField(max_length=200, blank=True, null=True)
paid = models.BooleanField(default=False)
patient = models.ForeignKey(to='Patient', on_delete=models.CASCADE,
related_name='accruals')
class Payment(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE,
related_name='payments')
date = models.DateField(db_index=True)
amount = models.DecimalField(decimal_places=2, max_digits=10)
method = models.ForeignKey(to='Method', on_delete=models.CASCADE,
related_name='payments')
info = models.CharField(max_length=200, blank=True, null=True)
patient = models.ForeignKey(to='Patient', on_delete=models.CASCADE,
related_name='payments')
Как вы можете видеть, эти две модели связаны через m2m поле "оплата" в модели начисления.
views.py
class NewPaymentFormView(generic.CreateView):
model = models.Payment
form_class = forms.NewPaymentForm
template_name = 'new_new_payment.html'
success_url = reverse_lazy('index')
def get_context_data(self, *, object_list=None, **kwargs):
context = super(NewPaymentFormView, self).get_context_data(**kwargs)
accrual_unpaid = models.Accrual.objects.filter(
paid=False)
context.update({
'accrual_unpaid': accrual_unpaid
})
return context
def form_valid(self, form):
form.instance.user = self.request.user
return super().form_valid(form)
def get_form_kwargs(self):
kwargs = super(NewPaymentFormView, self).get_form_kwargs()
kwargs.update({'user': self.request.user})
return kwargs
template.html
<div class="table-responsive">
<h1 class="h-25">Начисления</h1>
<table class="table table-striped table-sm">
<thead>
<tr>
<th scope="col">#</th>
<th scope="col">Пациент</th>
<th scope="col">Сумма</th>
<th scope="col">Дата</th>
<th scope="col">Оплачено</th>
<th scope="col">Дата оплаты</th>
<th scope="col">Метод оплаты</th>
<th scope="col"></th>
</tr>
</thead>
<tbody>
{% for accrual in accrual_unpaid %}
<tr>
<td>{{ forloop.counter }}</td>
<td>{{ accrual.patient }}</td>
<td>{{ accrual.amount|intcomma }}</td>
<td>{{ accrual.date }}</td>
<form method="post" enctype="multipart/form-data">
{% csrf_token %}
<td>{{ form.paid }}</td>
<td>{{ form.date }}</td>
<td>{{ form.method }}</td>
<td><button type="submit">Создать</button></td>
</form>
</tr>
{% empty %}
<h1 class="h2">Нет начислений</h1>
{% endfor %}
</tbody>
</table>
</div>
И я хотел бы, чтобы таблица выглядела так, но с одной кнопкой "submit" после. table image