Как отправить данные из двух форм в две таблицы в базе данных Django с помощью одного представления?
Я хочу отправить данные из двух форм в две таблицы в базе данных Django, но получаю ошибку "FOREIGN KEY constraint failed". Как я могу включить две формы в представление для отправки данных в таблицы базы данных?
Моими моделями являются модель User и
class Account(models.Model):
def create_new_ref_number():
not_unique = True
while not_unique:
unique_ref = random.randint(1000000000, 9999999999)
if not Account.objects.filter(account_number=unique_ref):
not_unique = False
return str(unique_ref)
user = models.ForeignKey(User, related_name='+', on_delete=models.CASCADE, default='0')
DOB = models.DateField('DOB', max_length=20)
address = models.CharField('Address', max_length=120)
contact_number = models.CharField('Contact Number', max_length=120)
...
account_number = models.CharField('Account Number', unique=True, max_length=20, null=False, editable=True, default=create_new_ref_number)
...
current_balance = models.IntegerField('Balance', default=0, null=True)
# transaction atomic allows to group changes in DB
# if save operation will fail transaction creation will be also restored
@transaction.atomic
def apply_deposit(self, amount: int):
# create new deposit transaction
Trans.objects.create(
user=self.user,
amount=amount,
account_number=self.account_number
)
# update balance
self.current_balance += amount
self.save()
def __str__(self):
return str(self.name)
Моими формами являются
class NewForm(ModelForm):
class Meta:
model = Account
fields = ('DOB', 'address', 'contact_number', 'account_number')
exclude = ['user', 'account_number']
labels = {
'DOB': '',
'address': '',
'contact_number': '',
}
widgets = {
'DOB': forms.DateInput(attrs={'class':'form-control','placeholder':'Date of Birth: dd/mm/yyyy'}, format='%m/%d/%y'),
'address': forms.TextInput(attrs={'class':'form-control','placeholder':'Address'}),
'contact_number': forms.TextInput(attrs={'class':'form-control','placeholder':'Contact Number'})
}
и
class RegisterUserForm(UserCreationForm):
email = forms.EmailField()
first_name = forms.CharField(max_length=50)
last_name = forms.CharField(max_length=50)
class Meta:
model = User
fields = ('username', 'first_name', 'last_name', 'email', 'password1', 'password2')
Мое мнение таково
def register_user(request):
submitted = False
if request.method == "POST":
register_form = RegisterUserForm(request.POST)
account_form = NewForm(request.POST)
if register_form .is_valid() and account_form.is_valid():
register = register_form.save()
account = account_form.save(False)
account.register = register
account.save()
username = form.cleaned_data['username']
password = form.cleaned_data['password1']
user = authenticate(username=username, password=password)
login(request, user)
messages.success(request, ("Regisatration successful."))
return redirect('home')
else:
register_form: RegisterUserForm()
account_form: NewForm()
register_form = RegisterUserForm
account_form = NewForm
return render(request, 'authenticate/register_user.html',
{'register_form': register_form,
'account_form' : account_form,
'submitted':submitted,}
)
Код, похоже, обрывается на account.save() с ошибкой. Кто-нибудь может помочь?
Вы можете попробовать написать второе представление, которое будет принимать только заявки из второй формы и перенаправлять обратно в предыдущее представление, например:
def my_view(request):
if request.method == 'POST':
# Do your stuff
return redirect()
А затем укажите url к этому представлению в атрибуте action="" второй формы