Django - po zalogowaniu przekierowuje użytkownika na jego własną stronę --> mysite.com/username
Domyślnie po zalogowaniu django przekierowuje użytkownika na stronę konta/profilu lub jeśli edytujesz LOGIN_REDIRECT_URL możesz wysłać użytkownika na inną stronę, którą podasz w settings.py.
To jest świetne, ale chciałbym, aby użytkownik (po zalogowaniu) został przekierowany na niestandardową stronę, gdzie link do tej strony wyglądałby mniej więcej tak: mysite.com/username
. Tak więc domyślne konta / profil lub ustawienia LOGIN_REDIRECT_URL nie będą działać w tym przypadku, ponieważ oba są w jakiś sposób statyczne. W moim przypadku sekcja username
adresu zmienia się dla każdego użytkownika.
Jakieś pomysły, Jak mogę to zrobić, gdy użytkownik jest zalogowany, aby przejść do niestandardowej strony użytkownika, która ma nazwę użytkownika w adresie jak: mysite.com/username
? Każdy wkład jest naprawdę doceniany.
6 answers
Możesz uwierzytelnić i zalogować użytkownika w sposób podany tutaj: http://docs.djangoproject.com/en/dev/topics/auth/#how-to-log-a-user-in
To daje dostęp do obiektu User, z którego można uzyskać nazwę Użytkownika, a następnie zrobić HttpResponseRedirect do niestandardowego adresu URL.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-02-02 04:04:47
Prostsze podejście polega na przekierowaniu ze strony LOGIN_REDIRECT_URL . Kluczową rzeczą do zrealizowania jest to, że informacje o użytkowniku są automatycznie dołączane do żądania.
Przypuśćmy:
LOGIN_REDIRECT_URL = '/profiles/home'
I skonfigurowałeś urlpattern:
(r'^profiles/home', home),
Następnie, wszystko co musisz napisać do widoku home()
to:
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]))
Gdzie NAME_OF_PROFILE_VIEW
to nazwa wywołania zwrotnego, którego używasz. Z django-profiles, NAME_OF_PROFILE_VIEW
może być 'profiles_profile_detail'.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-08-17 01:07:49
Tak! W Twoim settings.py zdefiniuj następujące
LOGIN_REDIRECT_URL = '/your-path'
I niech '/ your-path ' będzie prostym widokiem, który patrzy w górę self.request.user
i robi wszystko, czego potrzebuje, aby zwrócić obiekt HttpResponseRedirect
.
Lepszym sposobem może być zdefiniowanie prostego adresu URL, takiego jak '/simple'
, który ma tam logikę wyszukiwania. Adres URL wygląda piękniej, oszczędza pracę itp.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-07-19 21:32:37
Jeśli używasz wbudowanego LoginView
Django, przyjmuje next
jako kontekst, który jest " URL do przekierowania po udanym login
. Może również zawierać ciąg zapytania."(Zobacz docs )
Również z docs:
" jeśli logowanie się powiedzie, Widok zostanie przekierowany na adres URL podany w next
. Jeśli next nie jest podany, przekierowuje do settings.LOGIN_REDIRECT_URL
(domyślnie /accounts/profile/)."
Przykładowy kod:
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>
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-07 18:16:57
Ostatnio weszłam do django i szukałam rozwiązania tego problemu i znalazłam metodę, która może być przydatna.
Więc na przykład, jeśli używasz allouth domyślnym przekierowaniem jest konto / Profil. Tworzenie widoku, który przekierowuje wyłącznie do wybranej lokalizacji, używając pola Nazwa użytkownika w następujący sposób:
def profile(request):
name=request.user.username
return redirect('--choose where--/' + name + '/')
Następnie Utwórz widok, który przechwytuje go w jednej z Twoich aplikacji, na przykład:
def profile(request, name):
user = get_object_or_404(User, username=name)
return render(request, 'myproject/user.html', {'profile': user})
Gdzie przechwytywanie urlpatterns wyglądałoby tak:
url(r'^(?P<name>.+)/$', views.profile, name='user')
Mi pasuje.Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-04-29 06:04:34
return render(request,'page_location/page_name')
return render(request,'home/page-login.html')
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-07-20 18:56:14