Так что я использую Django Дополнительные просмотры, чтобы настроить форму заказа, которая включает как бронирование, так и платежи. Сотрудники могут создать заказ, который включает в себя одну или несколько бронирований и может включать несколько платежей.
Поскольку платежи являются необязательными, общая сумма будет проверена при сохранении формы. Если общий платеж> 0, набор payment_form сохраняется.
Теперь проблема в том, что, если сотрудник совершит ошибку и захочет удалить платеж? Мне нужно "min_num: 1" в PaymentInlineForm при создании формы, но я хочу проверить, если total_payment == 0, и если это так, удалить соответствующие записи о платежах. Я пытался использовать payment_formset.delete (), но он выдает ошибку;
Объект 'PaymentFormFormSet' не имеет атрибута 'delete'
views.py - Inlines
# Setting up the order form with inlines
class BookingInline(InlineFormSetFactory):
model = Booking
form_class = BookingForm
prefix = 'booking_formset'
factory_kwargs = {
'extra': 0,
'min_num': 1,
'validate_min': True,
'can_delete': True
}
class PaymentInline(InlineFormSetFactory):
model = Payment
form_class = PaymentForm
prefix = 'payment_formset'
factory_kwargs = {
'extra': 0,
'min_num': 1,
'validate_min': False,
'can_delete': True
}
views.py - OrderUpdateView
class OrderUpdateView(LoginRequiredMixin, NamedFormsetsMixin, UpdateWithInlinesView):
model = Order
inlines = [BookingInline, PaymentInline]
inlines_names = ['booking_formset', 'payment_formset']
form_class = OrderForm
template_name = 'orders/order_update_form.html'
def get_success_url(self):
return reverse_lazy('order_detail', kwargs={'pk': self.object.pk})
def forms_valid(self, form, inlines):
booking_formset = inlines[0]
payment_formset = inlines[1]
"""
If the form and formsets are valid, save the associated models.
"""
self.object = form.save(commit=False)
self.object.updated_by = self.request.user
# Check if coupon is applied and copy the discount to the order table
coupon = form.cleaned_data['coupon']
if coupon:
self.object.coupon_used = self.object.coupon.code
self.object.coupon_discount = self.object.coupon.discount
form.save(commit=True)
booking_formset.save()
payments = payment_formset.save(commit=False)
total_payment = sum(payment.amount for payment in payments)
if total_payment > 0:
payment_formset.save()
elif total_payment == 0:
payment_formset.delete()
return HttpResponseRedirect(self.get_success_url())
Проблема
if total_payment > 0:
payment_formset.save()
elif total_payment == 0:
payment_formset.delete()
Если сумма всех платежей равна 0, соответствующие записи о платежах должны быть удалены. В настоящее время он хранит старые записи и не удаляет их из базы данных.
Любая помощь будет признательна, или, может быть, есть другой подход для решения этой проблемы?
С наилучшими пожеланиями,
Кевин
Редактировать
Из документации; Если вы вызовете formset.save (commit = False), объекты не будут удалены автоматически. Вам нужно вызвать delete () для каждого из formset.deleted_objects, чтобы фактически удалить их:
payments = payment_formset.save(commit=False)
total_payment = sum(payment.amount for payment in payments)
if total_payment > 0:
payment_formset.save()
elif total_payment == 0:
for payment in payment_formset.deleted_objects:
payment.delete()
Поэтому я должен отметить все платежи, которые будут удалены, если total_payment равен нулю ...