Как создать отношения между 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, но это не сработало, как ожидалось, и я обнаружил, что я должен назначить пользователя для каждого плательщика вручную в панели администратора, в то время как я хочу, чтобы это было сделано автоматически

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