Django - после входа в систему перенаправить пользователя на свою страницу → mysite.com/username
По умолчанию после входа в систему django перенаправляет пользователя на страницу учетных записей/профилей, или если вы редактируете LOGIN_REDIRECT_URL, вы можете отправить пользователя на другую страницу, указанную в параметрах settings.py.
Это здорово, но я хотел бы, чтобы пользователь (после входа в систему) был перенаправлен на пользовательскую страницу, где ссылка на эту страницу будет выглядеть примерно так: mysite.com/username
. Таким образом, учетные записи по умолчанию или профиль или параметры LOGIN_REDIRECT_URL не будут работать в этом случае, так как оба являются статическими. В моем случае раздел username
адреса изменяется для каждого пользователя.
Любые идеи о том, как я могу это сделать, когда пользователь войдет в систему, перейдут на пользовательскую страницу пользователя с именем пользователя по адресу: mysite.com/username
? Любой вход действительно оценен.
Ответы
Ответ 1
Вы можете авторизоваться и войти в систему как указано здесь: https://docs.djangoproject.com/en/2.2/topics/auth/#how-to-log-a-user-in
Это даст вам доступ к объекту User, из которого вы можете получить имя пользователя и затем выполнить HttpResponseRedirect для пользовательского URL.
Ответ 2
Более простой подход основан на перенаправлении со страницы 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".
Ответ 3
Да! В файле settings.py укажите следующие
LOGIN_REDIRECT_URL = '/your-path'
И пусть "/ваш-путь" будет простым представлением, которое ищет self.request.user
и выполняет любую логику, чтобы вернуть объект HttpResponseRedirect
.
Лучшим способом может быть определение простого URL-адреса, такого как '/simple'
, который выполняет логику поиска. URL выглядит более красивым, экономит вам некоторую работу и т.д.
Ответ 4
Если вы используете встроенный в 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>
Ответ 5
При использовании представлений на основе классов другой вариант заключается в использовании метода отправки. 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)
Ответ 6
Недавно попал в Django, искал решение этой проблемы и нашел метод, который может быть полезен.
Например, если вы используете allouth, по умолчанию используется перенаправление учетных записей/профиля. Создайте представление, которое перенаправляет только на выбранное место, используя поле имени пользователя, например:
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')
Хорошо работает для меня.
Ответ 7
return render(request,'page_location/page_name')
return render(request,'home/page-login.html')