Как я могу сделать PIN активацию, регистрацию пользователя и аутентификацию в Django

Я работаю над проектом Django, в котором пользователи должны активировать PIN-код, а затем зарегистрироваться для получения места на мероприятии. Я сделал это таким образом, что пользователи активируют PIN и им предлагается регистрационная форма, чтобы обеспечить себе место на мероприятии. И я хочу получить название мероприятия, цену, дату, категорию из таблицы Ticket. Тем временем у меня есть модель гостя, которая сохраняет имя пользователя и пин-код с помощью запроса обновления во время процесса регистрации; используя поле формы для повторного запроса пин-кода (не хочу повторять этот процесс). И я использовал поле pin как ForeignKey в модели гостя, поэтому я получаю ошибку, что Cannot assign "'384513'": "Guest.pin" must be a "Pin" instance.

Каким образом лучше всего выполнить эту логику активации PIN, регистрации и аутентификации пользователя и получить значения Models, связанные с его PIN в этом случае. Я думал использовать таблицу Guest Table для получения информации, относящейся к событиям, билетам и Pin Details, но не получилось. Смотрите ниже код Модели:

class Ticket(models.Model):
    event = models.ForeignKey(Event, on_delete=models.CASCADE)
    price = models.PositiveIntegerField()
    category = models.CharField(max_length=100, choices=PAYMENT, default=None, blank=False, null=False)
    added_date = models.DateField(auto_now_add=True)

def __str__(self):
    return f"{self.event} "

#Prepare the url path for the Model
def get_absolute_url(self):
    return reverse("ticket-detail", args=[str(self.id)])

def generate_pin():
    return ''.join(str(randint(0, 9)) for _ in range(6))

class Pin(models.Model):
ticket = models.ForeignKey(Ticket, on_delete=models.CASCADE)
value = models.CharField(max_length=6, default=generate_pin, blank=True)
added = models.DateTimeField(auto_now_add=True,  blank=False)
reference = models.UUIDField(primary_key = True, editable = False, default=uuid.uuid4)
status = models.CharField(max_length=30, default='Not Activated')

#Save Reference Number
def save(self, *args, **kwargs):
     self.reference == str(uuid.uuid4())
     super().save(*args, **kwargs) 

def __unicode__(self):
    return self.ticket

class Meta:
    unique_together = ["ticket", "value"]

def __str__(self):
    return f"{self.ticket}"

class Guest(models.Model):
guest_name = models.CharField(max_length=30, null=True)
pin = models.ForeignKey(Pin, on_delete=models.CASCADE, max_length=6, null=True)


def __str__(self):
    return f"{self.guest_name}"

смотрите ниже код Views:

def pin_activation(request):

if request.method == "POST":
    
    #Create new form with name form
    form = PinActivationForm(request.POST)

    #Check if the the form has valid data in it
    if form.is_valid():

        #Check the status of the user Pin with the one in the Database
        check_pin_status = Pin.objects.filter(value=form['pin'].value(), status='Not Activated')

        #Check if the PIN is correct and NOT ACTIVATED
        if check_pin_status:

            #Update the User Pin with a new status of Activated
            Pin.objects.filter(value=form['pin'].value()).update(status='Validated')
            #Message the User
            messages.success(request, 'Pin Validated Successfully')
            #Redirect the user to register for seat
            return redirect('register-guest')
        #Check filter the DB where the PIN status is Validated
        elif Pin.objects.filter(value=form['pin'].value(), status="Validated"):
            messages.error(request, 'Pin Already Validated. Register for Seat')
            return redirect('register-guest')
        #Check Filter PIN in DB where Status is Activated
        elif  Pin.objects.filter(value=form['pin'].value(), status="Activated"):
            messages.error(request, "Pin Already Activated, Login.")
            return redirect('user-login')
            
               
    else:
        messages.error(request, 'Something Went Wrong. Try again')
else:
    form = PinActivationForm()
context = {
    'form':form,
}
return render(request, 'user/pin_activation.html', context)

def register_guest(request):
#Create variable and query all users
user_pins = Pin.objects.all()

page_title = "Festival Registration"
if request.method == 'POST':
    form = GuestUserForm(request.POST)
    pin_form = PinActivationForm(request.POST)
    if form.is_valid() and pin_form.is_valid():
        Guest.objects.create(guest_name=form['username'].value(), pin=pin_form['pin'].value())
        form.save()
        Pin.objects.filter(value=pin_form['pin'].value()).update(status='Activated')
        messages.success(request, 'Registered Successfully. Login')

        #Pin.objects.filter(value=form['pin'].value()).update(status='Validated')
        return redirect('user-login')
else:
    form = GuestUserForm()
    pin_form = PinActivationForm()
context = {
    'form':form,
    'pin_form':pin_form,
    'page_title':page_title,
}
return render(request, 'user/register.html', context)
Вернуться на верх