How Can I set and Get Django Form Value on Another View

Viewed 41

I am working on a Django Ticketing project where I want guest to activate Ticket PIN and then register for the event they bought the ticket for. And I also want them to have login user access and be able to update profile immediately after login.

The application usually start with PIN activation and thereafter guest registration. The issue is that I don't know how to pass the PIN value from the PIN activation view to the guest registration view.

Notice that I have used request.session['pin'] = pin_value to set the PIN as the session variable in the pin activation view and got it using user_pin = request.session.get('pin') in the register guest view but only the Guest.objects.create(guest_name=new_user, pin=user_pin) in the register guest view gets the session variable while the Pin.objects.filter(value=user_pin).update(status='Activated') fails to get the session variable for the registration process to be completed. I have tried using a literal value in the Pin filter and update query and it worked but using the session variable does not.

Below are my models:

class Guest(models.Model):
    guest_name = models.OneToOneField(User, on_delete=models.CASCADE, blank=True) 
    pin = models.CharField(max_length=6, default='No Pin', blank=True)


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

class Profile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE, null = True)
    surname = models.CharField(max_length=20, null=True)
    othernames = models.CharField(max_length=40, null=True)
    gender = models.CharField(max_length=6, choices=GENDER, blank=True, null=True)
    phone = PhoneNumberField()
    image = models.ImageField(default='avatar.jpg', blank=False, null=False, upload_to ='profile_images', 
)
    def __str__(self):
        return f'{self.user.username}-Profile'

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}"

    def get_absolute_url(self):
        return reverse("pin-detail", args=[str(self.id)])

My Views code:

def pin_activation(request):
    if request.method == "POST":
    
        #Create PIN form
        form = PinActivationForm(request.POST)
        #Get User Pin Value from Form
        pin_value = form['pin'].value()
        #Check if the the form has valid data in it
        if form.is_valid():
            try:
                #Get user Pin with the one in the Database
                check_pin_status = Pin.objects.get(value=pin_value)
            except Pin.DoesNotExist:
                messages.error(request, f'{pin_value} Does Not Exist')
                return redirect('pin-activation')
            else:

                #Check PIN status
                if check_pin_status:
                    #Get Event Ticket Date of the PIN
                    event_date = check_pin_status.ticket.event.date
                    #Get Current Date
                    current_date = datetime.now().date()
                    #Check if Event Date is Passed the Current Date
                    if event_date < current_date:
                        messages.error(request, 'Event Has Passed')
                        return redirect('pin-activation')
                    else:
                        #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
                request.session['pin'] = pin_value
                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):
    #get session variable
    user_pin = request.session.get('pin')
    form = GuestUserForm(request.POST) 
    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():
            new_user = form.save()
            Guest.objects.create(guest_name=new_user, pin=user_pin)
            
            Pin.objects.filter(value=user_pin).update(status='Activated')
            messages.success(request, 'Registered Successfully. Login')

       
            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)

Someone should please help with the best way of solving this problem. Thanks

1 Answers

you cannot save a quest as a User in this way. Do something like this. From youre form get the username. Then create a new User with that username and create the Guest with that new user.

  //simple form --> get it in youre template
  class GuestUserForm(forms.Form):
    username = forms.CharField()
    password=forms.CharField()

  //create new user from the form in template
  user_guest = form.cleaned_data.get("username")
            new_user = User.objects.create_user(username=user_guest)

  //create new guest with created user
  Guest.objects.create(guest_name=new_user)

//youre view function 
def register_guest(request):
    if request.method == 'POST':
        form = GuestUserForm(request.POST)
        if form.is_valid():
            user_guest = form.cleaned_data.get("username")
            print(user_guest)
            new_user = User.objects.create_user(username=user_guest)
            Guest.objects.create(guest_name=new_user)

    form = GuestUserForm()
    return render(request, "index.html",{"form":form})
Related