Home > Software design >  How to redirect logged-in user to a specific page in Django
How to redirect logged-in user to a specific page in Django

Time:08-28

Code was not written by me, I am just trying to find a way to redirect a logged-in user if he wants to access a certain page in a Python/Django script. I can actually do it in Templates but as far as I understand this logic should be implemented in Views.

Example: Already logged-in user tries to access to signup page by typing the signup page url/path. In this case, I would like to redirect the user to the homepage (/).

What I tried with very very basic Python and zero Django knowledge?. Inside the views/auth.py (SignUp class), I try to write a get method and check if user is already authenticated, redirect him to a specific page. And actually it worked for already logged-in users but if a guest/visitor wants to open the sign up page then it returns an error: "views.auth.SignUp didn't return an HttpResponse object. It returned None instead."

class SignUp(FormView):
    form_class = SignUpForm
    template_name = "dictionary/registration/signup.html"
    
    # I added
    def get(self, request, *args, **kwargs):
        if request.user.is_authenticated:
            return redirect('/')
        

    def form_valid(self, form):
        user = form.save(commit=False)
        user.username = form.cleaned_data.get("username").lower()
        user.theme = get_theme_from_cookie(self.request)

        user.save()
        send_email_confirmation(user, user.email)
        notifications.info(
            self.request,
            _(
                "a confirmation link has been sent to your e-mail address. by following"
            ),
        )
        return redirect("login")

and here is the SignUpForm class

class SignUpForm(UserCreationForm):
    email = forms.EmailField(
        max_length=224,
        help_text=_("required."),
        label=_("e-mail"),
    )
    terms_conditions = forms.BooleanField(required=True)

    class Meta:
        model = Author
        fields = (
            "username",
            "email",
            "password1",
            "password2",
        )

I hope this information is enough to guide me or at least give me some hints.

CodePudding user response:

Of course you get an error. If user.is_authenticated you return redirect('/').

def get(self, request, *args, **kwargs):
    if request.user.is_authenticated:
        return redirect('/')
    # where is else case for guests?

But if user is not authenticated - you return nothing.

Probably it should be:

def get(self, request, *args, **kwargs):
    if request.user.is_authenticated:
        return redirect('/')
    return super().get(request, *args, **kwargs)

By the way, why you don't use LoginView from django.contrib.auth.views?

  • Related