Django - après la connexion, rediriger l'utilisateur vers sa page personnalisée --> mysite.com/username
par défaut après la connexion django redirige l'utilisateur vers une page comptes / profil ou si vous éditez la LOGIN_REDIRECT_URL vous pouvez envoyer l'utilisateur à une autre page que vous spécifiez dans le settings.py.
c'est génial mais je voudrais que l'utilisateur (après connexion) soit redirigé vers une page personnalisée où le lien vers cette page ressemblerait à quelque chose comme ceci: mysite.com/username
. Ainsi, les comptes/profil par défaut ou les paramètres LOGIN_REDIRECT_URL ne fonctionneraient pas dans ce cas puisque les deux sont en quelque sorte statique. Dans mon cas, la section username
de l'adresse change pour chaque utilisateur.
des idées comment je peux faire alors lorsque l'utilisateur est connecté à un utilisateur personnalisée de la page qui a le nom de l'utilisateur, l'adresse comme: mysite.com/username
? Toute contribution est vraiment appréciée.
6 réponses
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 User à partir duquel vous pouvez obtenir le nom d'utilisateur et ensuite faire un Httpresponeredirect à L'URL personnalisée.
une approche plus simple repose sur une redirection à partir de la page LOGIN_REDIRECT_URL . La clé de chose à réaliser est que les informations de l'utilisateur est automatiquement inclus dans la demande.
Supposons que:
LOGIN_REDIRECT_URL = '/profiles/home'
et vous avez configuré un modèled'URL:
(r'^profiles/home', home),
alors, tout ce que vous devez é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]))
où NAME_OF_PROFILE_VIEW
est le le nom du rappel que vous utilisez. Avec django-profils, NAME_OF_PROFILE_VIEW
peut être "profiles_profile_detail'.
Oui! Dans votre settings.py définir ce qui suit
LOGIN_REDIRECT_URL = '/your-path'
et avoir '/your-path' être une vue simple qui regarde self.request.user
et fait n'importe quelle logique dont elle a besoin pour retourner un objet HttpResponseRedirect
.
une meilleure façon pourrait être de définir une URL simple comme '/simple'
qui fait la logique de recherche là. L'URL semble plus belle, vous sauve du travail, etc.
si vous utilisez le LoginView
intégré à Django , il prend next
comme contexte, qui est "L'URL à rediriger vers après succès login
. Cela peut aussi contenir une chaîne de requête."(voir docs )
Également de la documentation:
"Si la connexion est réussie, la vue redirige vers l'URL spécifiée dans next
. Si next n'est pas fourni, il redirige vers settings.LOGIN_REDIRECT_URL
(par défaut vers /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>
est arrivé à django récemment et a cherché une solution à cela et a trouvé une méthode qui pourrait être utile.
par exemple, si vous utilisez allouth, la redirection par défaut est accounts/profile. Faites une vue qui redirige uniquement vers un emplacement de choix en utilisant le champ Nom d'utilisateur comme ceci:
def profile(request):
name=request.user.username
return redirect('--choose where--/' + name + '/')
créez alors 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ù les urlpatterns capturent ressemblerait à ceci:
url(r'^(?P<name>.+)/$', views.profile, name='user')
Fonctionne bien pour moi.
return render(request,'page_location/page_name')
return render(request,'home/page-login.html')