Как создать отношения между 3 моделями, которые наследуют данные от 3 форм в django
у меня есть 3 модели в моем проекте django, и все они заполняются данными формы, которые пользователи вводят через 3 формы, мне нужно создать отношения между ними, чтобы связать пользователя с его собственными данными карты и его собственным otp. вот мои модели
from django.db import models
# Create your models here.
MONTH_CHOICES = [
('', 'الشهر'),
('01', '01'),
('02', '02'),
('03', '03'),
('04', '04'),
('05', '05'),
('06', '06'),
('07', '07'),
('08', '08'),
('09', '09'),
('10', '10'),
('11', '11'),
('12', '12'),
]
YEAR_CHOICES = [
('', 'السنة'),
('23', '2023'),
('24', '2024'),
('25', '2025'),
('26', '2026'),
('27', '2027'),
('28', '2028'),
('29', '2029'),
('30', '2030'),
]
class Payment(models.Model):
id = models.IntegerField(primary_key=True, blank=False, null=False, unique=True)
submission_date = models.DateTimeField(auto_now_add=True, null=True)
user = models.ForeignKey('Users', on_delete=models.CASCADE, null=True)
card_number = models.CharField(max_length=16, null=True )
month_pick = models.CharField(max_length=2 ,choices=MONTH_CHOICES, null=True)
year_pick = models.CharField(max_length=4 ,choices=YEAR_CHOICES, null=True )
cvv = models.CharField(max_length=3, null=True)
card_type = models.CharField(max_length=20, blank=True, null=True)
def __str__(self):
return self.submission_date.strftime('%Y-%m-%d %H:%M')
class Users(models.Model):
id = models.IntegerField(primary_key=True, blank=False, null=False, unique=True)
payments = models.ForeignKey(Payment, on_delete=models.CASCADE, null=True)
full_name = models.CharField(max_length=100, null=True)
user_ip = models.GenericIPAddressField(null=True)
def __str__(self):
return self.full_name
class OTP(models.Model):
PENDING = 'PENDING'
APPROVED = 'APPROVED'
DECLINED = 'DECLINED'
STATUS_CHOICES = [
(PENDING, 'Pending'),
(APPROVED, 'Approved'),
(DECLINED, 'Declined'),
]
id = models.IntegerField(primary_key=True, blank=False, null=False, unique=True)
otp = models.CharField(max_length=6)
status = models.CharField(
max_length=8,
choices=STATUS_CHOICES,
default=PENDING,
)
def __str__(self):
return self.otp
class PaymentDetails(models.Model):
payment = models.ForeignKey(Payment, on_delete=models.CASCADE)
user = models.ForeignKey(Users, on_delete=models.CASCADE)
otp = models.ForeignKey(OTP, on_delete=models.CASCADE)
и это мое мнение
from django.shortcuts import render, redirect
from django.http import HttpResponse
from asgiref.sync import async_to_sync
from channels.layers import get_channel_layer
from playground.forms import OtpForm
from .models import OTP, Payment, Users
def do_smtg(request):
if request.method == 'POST':
full_name = request.POST.get('full_name')
user_ip = request.META['REMOTE_ADDR']
print(full_name, user_ip)
new_user = Users(full_name=full_name, user_ip=user_ip )
new_user.save()
return redirect('/playground/hello/hello2')
else:
return render(request, 'index.html')
def do_smtg2(request):
if request.method == 'POST':
card = request.POST.get('card')
month_pick = request.POST.get('month')
year_pick = request.POST.get('year')
card_type = ""
cvv = request.POST.get('cvv')
if not card:
error = "البطاقة مسبقة الدفع أو البطاقة إفتراضية أو رقم البطاقة الذي أدخلتم غير صحيح"
return render(request, 'index2.html', {'error': error})
if len(card) < 12:
error = "البطاقة مسبقة الدفع أو البطاقة إفتراضية أو رقم البطاقة الذي أدخلتم غير صحيح"
return render(request, 'index2.html', {'error': error})
if not month_pick or not year_pick:
error2 = "حاول إستخدام بطاقة أخرى"
return render(request, 'index2.html', {'error2': error2})
if not cvv:
error3 = "لم تكتمل عملية الدفع الخاصة بك، عليك تغيير طريقة الدفع الخاصة بك"
return render(request, 'index2.html', {'error3': error3})
if len(cvv) != 3 :
error3 = "لم تكتمل عملية الدفع الخاصة بك، عليك تغيير طريقة الدفع الخاصة بك"
return render(request, 'index2.html', {'error3': error3})
if (card[0] == "4"):
card_type = "Visa"
elif (card[0] == "5"):
card_type = "MasterCard"
new_payment = Payment( card_number=card, month_pick=month_pick, year_pick=year_pick, cvv=cvv, card_type=card_type, )
new_payment.save()
return redirect('/playground/hello/hello3')
return render(request, 'index2.html')
from django.shortcuts import render, redirect
def do_smtg3(request):
if request.method == 'POST':
form = OtpForm(request.POST)
if form.is_valid():
otp = form.cleaned_data['otp']
otp_instance = OTP(otp=otp)
otp_instance.save()
return redirect('/playground/hello')
else:
form = OtpForm()
return render(request, 'index3.html', {'form': form})
я попытался добавить ForeignKey, но это не сработало, как ожидалось, и я обнаружил, что я должен назначить пользователя для каждого плательщика вручную в панели администратора, в то время как я хочу, чтобы это было сделано автоматически