Django Дополнительные представления - Удалить «InlineFormset», если условие выполнено при обновлении - PullRequest
0 голосов
/ 01 февраля 2020

Так что я использую 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 равен нулю ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...