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

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

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

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

6 ответов


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

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


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

допустим:

LOGIN_REDIRECT_URL = '/profiles/home'

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

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

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

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 - это имя обратного вызова, который вы используете. С django-профилями,NAME_OF_PROFILE_VIEW может быть 'profiles_profile_detail'.


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

LOGIN_REDIRECT_URL = '/your-path'

и у "/ your-path " будет простой вид, который смотрит вверх self.request.user и делает любую логику, чтобы вернуть


если вы используете встроенный Django LoginView, требуется next как контекст ,который является " URL для перенаправления после успешного login. Это также может содержать строку запроса.(см.--10-->docs)

также документы:

" при успешном входе в систему представление перенаправляется на URL, указанный в next. Если 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>

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

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

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})

где захват urlpatterns будет выглядеть так это:

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

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


return render(request,'page_location/page_name')

return render(request,'home/page-login.html')