Обработка формы 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.