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.

Author: avatar, 2011-02-02

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.

 6
Author: Abid A,
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'.

 63
Author: Stu,
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.

 3
Author: Jarvis Jones,
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>
 1
Author: kimbo,
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.
 0
Author: mromanda,
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')
 -3
Author: Mukesh Sahni,
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