Как остановить удаление полей при обновлении в Django?
У меня есть страница обновления формы. Изначально я просто использовал поля даты, но пользователь попросил включить переключатель дат, поэтому я перешел к приведенному ниже коду. Теперь каждый раз, когда я обновляю поле даты (скажем, дата платежа 3), оно обновляется нормально, но при этом удаляются другие поля даты. Есть идеи, почему? Я новичок в виджетах DateInput().
В файле views.py:
def ParticipantPayments(request, pk):
page_heading = "Update Participant's Payments"
order = Order.objects.get(pk=pk)
payment = ParticipantPayment.objects.get(customer=order.customer)
customer = int(order.customer.id)
firstname = payment.customer.first_name
lastname = payment.customer.last_name
form = UpdatePaymentForm(instance=payment)
if request.method == 'POST':
form = UpdatePaymentForm(request.POST, request.FILES, instance=payment)
if form.is_valid():
form.save()
messages.info(request, 'Your Form has been successfully submitted. ')
return redirect('finance_participants')
context = {'form':form,'customer':customer,'page_heading': page_heading, 'order':order,
'firstname':firstname, 'lastname':lastname}
return render(request, 'accounts/part_payments.html', context)
В файле models.py:
class ParticipantPayment(models.Model):
#other code not relevant
customer = models.ForeignKey(Customer, on_delete= models.CASCADE, null = True)
fee = models.IntegerField(verbose_name = "Registration Fee", blank=False, default = 750)
currency = models.CharField(verbose_name = "Currency", max_length=10, null=True, choices=MONEY,default='GBP')
crowd_fund = models.DecimalField(verbose_name = "Crowd Fund Amount", max_digits=5,decimal_places=2, default = 0)
ir_discount = models.DecimalField(verbose_name = "Euro Discount Amount", max_digits=5,decimal_places=2, default = 0)
bursary = models.DecimalField(verbose_name = "Bursary Amount", max_digits=5,decimal_places=2, default = 0)
payment_1_amount = models.DecimalField(max_digits=5, decimal_places=2, default = 0)
payment_1_date = models.DateField(null=True,blank=True)
payment_2_amount = models.DecimalField(max_digits=5, decimal_places=2, default = 0)
payment_2_date = models.DateField(null=True,blank=True)
payment_3_amount = models.DecimalField(max_digits=5, decimal_places=2, default = 0)
payment_3_date = models.DateField(null=True,blank=True)
payment_4_amount = models.DecimalField(max_digits=5, decimal_places=2, default = 0, null=True,blank=True)
payment_4_date = models.DateField(null=True,blank=True)
payment_5_amount = models.DecimalField(max_digits=5, decimal_places=2, default = 0, null=True,blank=True)
payment_5_date = models.DateField(null=True,blank=True)
payment_6_amount = models.DecimalField(max_digits=5, decimal_places=2, default = 0, null=True,blank=True)
payment_6_date = models.DateField(null=True,blank=True)
note = models.CharField(max_length=1000, null=True,blank=True)
refund_amount = models.DecimalField(max_digits=5, decimal_places=2, default = 0)
refund_date = models.DateField(null=True,blank=True)
def fee_owing(self):
return self.fee - self.crowd_fund - self.ir_discount- self.bursary
def total_paid(self):
return self.crowd_fund + self.ir_discount + self.bursary + self.payment_1_amount + self.payment_2_amount + self.payment_3_amount + self.payment_4_amount + self.payment_5_amount + self.payment_6_amount - self.refund_amount
def part_balance(self):
return self.fee - self.crowd_fund - self.ir_discount - self.bursary - self.payment_1_amount - self.payment_2_amount - self.payment_3_amount - self.payment_4_amount - self.payment_5_amount - self.payment_6_amount + self.refund_amount
def __str__(self):
return self.customer.last_name + ", " + self.customer.first_name
В файле forms.py:
class UpdatePaymentForm(ModelForm):
class Meta:
model = ParticipantPayment
fields ='__all__'
exclude = ['customer']
widgets = {'payment_1_date' : DateInput(),
'payment_2_date' : DateInput(),
'payment_3_date' : DateInput(),
'payment_4_date' : DateInput(),
'payment_5_date' : DateInput(),
'payment_6_date' : DateInput(),
}
Я в полном тупике и буду признателен за любые предложения.
Я разобрался с этой проблемой и надеюсь, что решение поможет кому-то еще. Проблема заключается в настройках формата даты по умолчанию в Django, а не в виджете выбора даты. Поэтому я изменил настройки виджета в файле forms.py
, чтобы включить:
widgets = {
'payment_1_date': DateInput(),
'payment_2_date': DateInput(format=('%Y-%m-%d')),
...
И это помогло разобраться с проблемой. Дайте мне знать, если вы найдете более простой вариант.