it-swarm.com.ru

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

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

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

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

30
avatar

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

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

6
Abid A

Более простой подход основан на перенаправлении со страницы 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 может быть «profile_profile_detail».

65
Stu

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

LOGIN_REDIRECT_URL = '/your-path'

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

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

4
Jarvis Jones

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

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

«Если вход в систему выполнен успешно, представление перенаправляется на URL-адрес, указанный в next. Если следующий не указан, он перенаправляется на settings.LOGIN_REDIRECT_URL (по умолчанию это/account/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>
2
kimbo

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

Так, например, если вы используете allouth, перенаправление по умолчанию - это account/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})

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

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

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

0
mromanda