web-dev-qa-db-fra.com

Django - après la connexion, redirige l'utilisateur vers sa page personnalisée -> mysite.com/username

Par défaut, après la connexion, Django redirige l'utilisateur vers une page de comptes/profil ou, si vous modifiez LOGIN_REDIRECT_URL, vous pouvez envoyer l'utilisateur vers une autre page spécifiée dans le fichier settings.py.

C'est formidable, mais j'aimerais que l'utilisateur (après la connexion) soit redirigé vers une page personnalisée où le lien vers cette page ressemblerait à ceci: mysite.com/username. Par conséquent, les paramètres comptes/profil par défaut ou les paramètres LOGIN_REDIRECT_URL ne fonctionneraient pas dans ce cas car les deux sont en quelque sorte statiques. Dans mon cas, la section username de l'adresse change pour chaque utilisateur. 

Toutes les idées sur la manière dont je peux faire en sorte que, lorsque l'utilisateur est connecté, accèdent à une page utilisateur personnalisée comportant le nom de l'utilisateur à l'adresse suivante: mysite.com/username? Toute entrée est vraiment appréciée. 

30
avatar

Vous pouvez authentifier et connecter l'utilisateur comme indiqué ici: http://docs.djangoproject.com/en/dev/topics/auth/#how-to-log-a-user-in

Cela vous donnera accès à l'objet Utilisateur à partir duquel vous pouvez obtenir le nom d'utilisateur, puis effectuer un HttpResponseRedirect vers l'URL personnalisée.

6
Abid A

Une approche plus simple repose sur la redirection à partir de la page LOGIN_REDIRECT_URL . L’essentiel est que les informations de l’utilisateur soient automatiquement incluses dans la demande.

Supposer:

LOGIN_REDIRECT_URL = '/profiles/home'

et vous avez configuré un urlpattern:

(r'^profiles/home', home),

Ensuite, tout ce dont vous avez besoin d’écrire pour la vue home() est:

from Django.http import HttpResponseRedirect
from Django.core.urlresolvers import reverse
from Django.contrib.auth.decorators import login_required

@login_required
def home(request):
    return HttpResponseRedirect(
               reverse(NAME_OF_PROFILE_VIEW, 
                       args=[request.user.username]))

NAME_OF_PROFILE_VIEW est le nom du rappel que vous utilisez. Avec Django-profiles, NAME_OF_PROFILE_VIEW peut être 'profiles_profile_detail'.

65
Stu

Oui! Dans votre settings.py définissez ce qui suit

LOGIN_REDIRECT_URL = '/your-path'

Et «/ votre-chemin» doit être une simple vue qui recherche self.request.user et utilise la logique nécessaire pour renvoyer un objet HttpResponseRedirect.

Un meilleur moyen pourrait être de définir une URL simple, telle que '/simple', qui effectue la logique de recherche. L'URL est plus belle, vous épargne du travail, etc.

4
Jarvis Jones

Si vous utilisez la variable LoginView intégrée de Django, le contexte est next, qui correspond à "L'URL vers laquelle rediriger après la réussite de login. Cela peut également contenir une chaîne de requête." (voir docs

Aussi de la documentation:

"Si la connexion aboutit, la vue redirige vers l’URL spécifiée dans next. Si next n’est pas renseignée, elle redirige vers settings.LOGIN_REDIRECT_URL (dont la valeur par défaut est/accounts/profile /)."

Exemple de code:

urls.py

from Django.urls import path
from Django.contrib.auth import views as auth_views

from account.forms import LoginForm # optional form to pass to view


urlpatterns = [
    ...

    # --------------- login url/view -------------------
    path('account/login/', auth_views.LoginView.as_view(
        template_name='login.html',  
        authentication_form=LoginForm, 
        extra_context={ 

            # option 1: provide full path
            'next': '/account/my_custom_url/', 

            # option 2: just provide the name of the url
            # 'next': 'custom_url_name',  
        },
    ), name='login'),

    ...
]

login.html

...

<form method="post" action="{% url 'login' %}">

  ...

  {# option 1 #}
  <input type="hidden" name="next" value="{{ next }}">

  {# option 2 #}
  {# <input type="hidden" name="next" value="{% url next %}"> #}

</form>
2
kimbo

Je me suis récemment rendu à Django, je cherchais une solution à ce problème et j'ai trouvé une méthode qui pourrait être utile.

Ainsi, par exemple, si vous utilisez allouth, la redirection par défaut est accounts/profile . Créez une vue qui redirige uniquement vers un emplacement de votre choix en utilisant le champ du nom d'utilisateur, comme suit:

def profile(request):
    name=request.user.username
    return redirect('-----choose where-----' + name + '/')

Créez ensuite une vue qui la capture dans l'une de vos applications, par exemple:

def profile(request, name):
    user = get_object_or_404(User, username=name)
    return render(request, 'myproject/user.html', {'profile': user})

Où l'urlpatterns capturé ressemblerait à ceci:

url(r'^(?P<name>.+)/$', views.profile, name='user')

Fonctionne bien pour moi.

0
mromanda