Search code examples
djangoif-statementurluid

Django how to check if user is in path


I made an unique url and I want to check if the acutal url contains the uid so I made a if statement which is always false in my case so what can I change that it works and checks if the path contains the uid.

views.py

@login_required(login_url='home:login')
def ChangeEmailView(request, token):
   packet = get_object_or_404(TempUrl, user=request.user)
   token = packet.uid
   if request.path == str(token):
       if request.method == 'POST':
           objects = User.objects.get(email = request.user.email)
           form = EmailChangingForm(request.POST, instance=objects)
           if form.is_valid():
               form.save()
               
           return redirect('home:profilesettings')
           
       else:
           objects = User.objects.get(email = request.user.email)
           form = EmailChangingForm(request.POST, instance=objects)
           packet = get_object_or_404(TempUrl, user=request.user)
           token = packet.uid
       
   else:  
       print('site wasnt found')
       objects = User.objects.get(email = request.user.email)
       form = EmailChangingForm(request.POST, instance=objects)
       packet = get_object_or_404(TempUrl, user=request.user)
       token = packet.uid
       return redirect('home:index')
   context = {'form': form, 'token': token}
   return render(request, 'home/email_settings.html', context)

Solution

  • Given that URL bound to ChangeEmailView was set by

    path('settings/email/changeemail/<str:token>', views.ChangeEmailView , name="changeemail")
    

    then if request.path == str(token) is always False because request.path includes full URL path (i.e. /settings/email/changeemail/) not just your token.

    I think you want the following

    @login_required(login_url='home:login')
    def ChangeEmailView(request, token):
       packet = get_object_or_404(TempUrl, user=request.user)
       site_token = packet.uid
       if token == str(site_token):
           if request.method == 'POST':
               objects = User.objects.get(email = request.user.email)
               form = EmailChangingForm(request.POST, instance=objects)
               if form.is_valid():
                   form.save()
                   
               return redirect('home:profilesettings')
               
           else:
               objects = User.objects.get(email = request.user.email)
               form = EmailChangingForm(request.POST, instance=objects)
               packet = get_object_or_404(TempUrl, user=request.user)
               token = packet.uid
           
       else:  
           print('site wasnt found')
           objects = User.objects.get(email = request.user.email)
           form = EmailChangingForm(request.POST, instance=objects)
           packet = get_object_or_404(TempUrl, user=request.user)
           token = packet.uid
           return redirect('home:index')
       context = {'form': form, 'token': token}
       return render(request, 'home/email_settings.html', context)
    

    Django will extract last entry of URL path and pass to your view as the token parameter, you can just use that to check if your uid is present.