Django - после входа перенаправляет пользователя на его персонализированную страницу - ›mysite.com/username

По умолчанию после входа в систему django перенаправляет пользователя на страницу учетных записей / профиля или, если вы редактируете LOGIN_REDIRECT_URL, вы можете отправить пользователя на другую страницу, указанную в settings.py.

Это замечательно, но я бы хотел, чтобы пользователь (после входа в систему) был перенаправлен на настраиваемую страницу, где ссылка на эту страницу будет выглядеть примерно так: mysite.com/username. Таким образом, учетные записи / профиль по умолчанию или настройки LOGIN_REDIRECT_URL не будут работать в этом случае, поскольку оба каким-то образом статичны. В моем случае раздел username адреса меняется для каждого пользователя.

Любые идеи, как я могу сделать так, чтобы, когда пользователь вошел в систему, переходил бы на настраиваемую страницу пользователя с именем пользователя в адресе, например: mysite.com/username? Любой вклад действительно приветствуется.


person avatar    schedule 02.02.2011    source источник


Ответы (6)


Вы можете аутентифицировать и войти в систему, как указано здесь: https://docs.djangoproject.com/en/dev/topics/auth/default/#how-to-log-a-user-in

Это даст вам доступ к объекту User, из которого вы можете получить имя пользователя, а затем выполнить HttpResponseRedirect для настраиваемого URL-адреса.

person Abid A    schedule 02.02.2011
comment
Я забыл упомянуть, что использую django.contrib.auth.views, который поставляется с django. Могу ли я получить в этом случае пользовательский URL-адрес, описанный выше? - person avatar; 02.02.2011
comment
Я не уверен, что вы можете настроить auth.views.login до такой степени. Тем не менее, я бы просто написал свою собственную функцию входа в систему, точно такую ​​же, как в документации, на которую я ссылался выше. - person Abid A; 02.02.2011

Более простой подход основан на перенаправлении со страницы LOGIN_REDIRECT_URL . Важно понимать, что информация о пользователе автоматически включается в запрос.

Предполагать:

LOGIN_REDIRECT_URL = '/profiles/home'

и вы настроили urlpattern:

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

Затем все, что вам нужно написать для представления home(), это:

from django.http import HttpResponseRedirect
from django.urls 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 - имя используемого обратного вызова. В django-profiles NAME_OF_PROFILE_VIEW может быть 'profiles_profile_detail'.

person Stu    schedule 15.08.2011
comment
Как насчет представлений на основе классов? - person User; 19.01.2015
comment
@User представление home может перенаправить на любой шаблон URL, не имеет значения, использует ли он представление на основе функций или представление на основе классов. - person Alasdair; 18.03.2016
comment
Единственная проблема с этим (которая может не быть проблемой для вас) заключается в том, что если в get для входа указан? Next = / someurl /, вы никогда не попадете на LOGIN_REDIRECT_URL, поэтому единственный способ гарантировать, что они в конечном итоге по URL-адресу, который вы хотите, - это реализовать свое собственное представление. - person Lehrian; 04.10.2018

Да! В вашем settings.py определите следующее

LOGIN_REDIRECT_URL = '/your-path'

И пусть '/ your-path' будет простым View, который ищет self.request.user и выполняет необходимую логику для возврата объекта HttpResponseRedirect.

Лучшим способом может быть определение простого URL-адреса, такого как '/simple', который выполняет там логику поиска. URL выглядит красивее, избавляет от лишней работы и т. Д.

person Jarvis Jones    schedule 19.07.2017

Если вы используете встроенный LoginView в Django, он принимает next в качестве контекста, который представляет собой «URL-адрес для перенаправления после успешного login. Он также может содержать строку запроса». (см. документы)

Также из документов:

«Если вход прошел успешно, представление перенаправляет на URL, указанный в next. Если следующий не указан, оно перенаправляется на settings.LOGIN_REDIRECT_URL (по умолчанию на / accounts / profile /)».

Пример кода:

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>
person kimbo    schedule 07.08.2018
comment
По умолчанию любое представление, которое перенаправляет на логин, будет содержать следующую переменную. В случае, если пользователь входит в систему по URL-адресу для входа напрямую, следующего не будет, и система по умолчанию будет использовать LOGIN_REDIRECT_URL. На всякий случай, если вам нужно специально обработать это, как было рекомендовано, extra_context={"next":mysite.com/username} разрешит это требование. - person Doogle; 14.10.2018
comment
Протестировано с Django 2.2.5, и вам также необходимо указать: redirect_authenticated_user = True в словаре extra_context, чтобы это решение работало. - person cristian; 08.10.2019
comment
@cristian Я считаю, что redirect_authenticated_user является отдельным параметром функции as_view (т.е. он не входит в extra_context) (см. docs.djangoproject.com/en/2.2/topics/auth/default/). Он контролирует, что происходит, если уже аутентифицированный пользователь посещает страницу входа (перенаправляет их куда-нибудь, как если бы они только что вошли в систему, или просто позволяя им посещать страницу). - person kimbo; 08.10.2019

При использовании представлений на основе классов другим вариантом является использование метода отправки. https://docs.djangoproject.com/en/2.2/ref/class-based-views/base/

Пример кода:

Settings.py

LOGIN_URL = 'login'
LOGIN_REDIRECT_URL = 'home'

urls.py

from django.urls import path
from django.contrib.auth import views as auth_views
urlpatterns = [
path('', HomeView.as_view(), name='home'),
path('login/', auth_views.LoginView.as_view(),name='login'),
path('logout/', auth_views.LogoutView.as_view(), name='logout'),
]

views.py

from django.utils.decorators import method_decorator
from django.contrib.auth.decorators import login_required
from django.views.generic import View
from django.shortcuts import redirect

@method_decorator([login_required], name='dispatch')
class HomeView(View):
    model = models.User

    def dispatch(self, request, *args, **kwargs):
        if not request.user.is_authenticated:
            return redirect('login')
        elif some-logic:
            return redirect('some-page') #needs defined as valid url
        return super(HomeView, self).dispatch(request, *args, **kwargs)
person Cliff Robbins    schedule 17.05.2019

Недавно зашел в django, искал решение и нашел метод, который может быть полезен.

Так, например, при использовании allouth перенаправление по умолчанию - accounts / profile. Создайте представление, которое перенаправляет исключительно в выбранное место, используя поле имени пользователя, например:

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

Затем создайте представление, которое фиксирует его в одном из ваших приложений, например:

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

Где захват URL-шаблонов будет выглядеть так:

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

У меня хорошо работает.

person mromanda    schedule 29.04.2017