Как я могу создать объект Django после формы подтверждения

Я работаю над сберегательным приложением, где я хочу, чтобы пользователь подтвердил депозит перед добавлением его в базу данных. Я перепробовал все возможные варианты, но после нажатия на кнопку Confirm в форме Dailog система перенаправляет меня обратно в форму депозита, выдавая ошибку, что поле не может быть пустым.

Код модели:

class Deposit(models.Model):
    customer = models.ForeignKey(Customer, on_delete=models.CASCADE, null=True)
    acct = models.CharField(max_length=6, null=True)
    staff = models.ForeignKey(User, on_delete=models.CASCADE, null=True)
    deposit_amount = models.PositiveIntegerField(null=True)
    date = models.DateTimeField(auto_now_add=True)

    def get_absolute_url(self):
        return reverse('create_account', args=[self.id])

    def __str__(self):
       return f'{self.customer} Deposited {self.deposit_amount} by {self.staff.username}'

Код формы:

class CustomerDepositForm(forms.ModelForm):

    class Meta:
       model = Deposit
       fields = ['deposit_amount']

Код просмотров:

def customer_deposit(request, id):
    context = {}
    form = CustomerDepositForm(request.POST or None)
    #Set Page Title
    page_title = "Customer Deposit"
    #Get Current Date
    current_date = datetime.now().date()
    #Get Current Month Name from Calendar
    current_month_name = calendar.month_name[date.today().month]

    try:
        #Check the Customer ID in DB
        customer = Customer.objects.get(id=id)
        #Customer Account
        acct = customer.account_number
   except Customer.DoesNotExist:
        messages.error(request, 'Customer Does Not Exist')
        return redirect('customer_create')
   else:
       #Get the Customer total deposit
       deposit = Deposit.objects.filter(customer_id = id).aggregate(total=Sum('deposit_amount')
       )['total'] or Decimal()
       if request.method == 'POST':
            #Deposit Form
            form = CustomerDepositForm(request.POST or None)
            if form.is_valid():
                amount = form.cleaned_data['deposit_amount']
                context.update(  {
                'deposit':deposit,
                'page_title':page_title,
                'customer':customer,
                'current_date':current_date,
                'current_month_name':current_month_name,
                'form':form,
                'amount':amount,
                'acct':acct,
                })
                return render(request, 'dashboard/deposit_approval_form.html', context)
            
        else:
            form = CustomerDepositForm()
            context = {
            'deposit':deposit,
            'page_title':page_title,
            'customer':customer,
            'current_date':current_date,
            'current_month_name':current_month_name,
            'form':form,
        
            'acct':acct,
            }
            return render(request, 'dashboard/deposit.html', context)

def approve_deposit(request, id):
    user = request.user
    form = CustomerDepositForm(request.POST or None)
    amount = form.cleaned_data['deposit_amount'].value()
    try:
        #Check the Customer ID in DB
        customer = Customer.objects.get(id=id)
        #Customer Account
        acct = customer.account_number
   except Customer.DoesNotExist:
       messages.error(request, 'Customer Does Not Exist')
       return redirect('customer_create')
   else:
       if request.method == 'POST':
           #Create Customer Deposit
           credit_acct = Deposit.objects.create(customer=customer, acct=acct, staff=user,    deposit_amount=amount)
           credit_acct.save()
           messages.success(request, f'N{amount} Credited for Account {acct} Successfully.')
           return redirect('deposit-slip')
               
      else:
          form = CustomerDepositForm()

return render(request, 'dashboard/deposit_approval_form.html')

Код шаблона утверждения депозита:

<form method="POST">
               {% csrf_token %} 

             

            <a class="btn btn-secondary" href="{% url 'create-deposit' customer.id %}">Cancel</a>

               <input class="btn btn-danger" type="submit" value="Confirm">
           </form>

Кто-нибудь должен помочь с наилучшим способом достижения этого. Спасибо

Вы должны использовать null=True, blank=True для поля, которое вы не используете в форме. А затем снова выполнить миграцию

null = True, blank = False означает, что поле может быть пустым в DATABASE, но НЕ в FORM и наоборот.

По моим наблюдениям, вы не отправляете форму в try block, вы отправляете форму только в else block. Форма никогда не будет отправлена, потому что try block всегда истинна

Вернуться на верх