Обработка формы Django - как создать запись и добавить ее в качестве ForeignKey

Я хотел бы решить проблему с обработкой форм в моем файле views.py.

Я хочу обработать форму ModelForm. Вместо того чтобы позволить пользователю заполнить поле Field fk_transaction, я хочу создать новую запись Transaction и добавить ее в качестве ForeignKey в фоновом режиме к CcountBooking. Форма в шаблоне отображается корректно. Также успешно создается транзакция. Однако когда я хочу добавить и сохранить ее в форму в views.py, она выдает ошибку, говоря мне, что поле не существует. Спасибо за любую помощь!

Мой views.py:

from django.http import HttpResponse
from django.shortcuts import render
from forms import AccountBookingForm
from models import Transaction


def deposit(request):
    context = {}
    if request.method == "POST":
        form = AccountBookingForm(request.POST)
        t = Transaction()
        form.fk_transaction = t
        form.save()
        return render(request, "deposit_success.html", {"form": form})
    else:
        form = AccountBookingForm()
        return render(request, "deposit.html", {"form": form})

Мой models.py:

class Transaction(models.Model):
    type = models.CharField(max_length=11, choices=TR_TYPE_CHOICES, default=DEPOSIT)
    status = models.CharField(max_length=11, choices=TR_STATUS_CHOICES, default=DRAFT)
    text = models.TextField(max_length=500, default="", blank=True)


class AccountBooking(models.Model):
    fk_bankaccount = models.ForeignKey(
        BankAccount, on_delete=models.CASCADE, blank=False)
    fk_transaction = models.ForeignKey(Transaction, on_delete=models.CASCADE, blank=False)
    value = models.DecimalField(max_digits=14, decimal_places=2, blank=False)

My forms.py

from django.forms import ModelForm
from .models import AccountBooking

class AccountBookingForm(ModelForm):
    class Meta:
        model = AccountBooking
        fields = ["__all__"]
        exclude = ("fk_transaction",)

Проверьте форму и создайте транзакцию, если форма действительна:

from django.shortcuts import redirect, render
from forms import AccountBookingForm
from models import Transaction


def deposit(request):
    if request.method == 'POST':
        form = AccountBookingForm(request.POST, request.FILES)
        if form.is_valid():
            form.instance.fk_transaction = Transaction.objects.create()
            form.save()
            return redirect('name-of-view')
    else:
        form = AccountBookingForm()
    return render(request, 'deposit.html', {'form': form})

Note: While most forms do not process media files, it is probably better to pass request.FILES [Django-doc] to the form anyway, such that if you later add an extra media field, all views that use the form will indeed handle the files properly.


Note: In case of a successful POST request, you should make a redirect [Django-doc] to implement the Post/Redirect/Get pattern [wiki]. This avoids that you make the same POST request when the user refreshes the browser.

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