ログイン後のデフォルトでは、Django=はユーザーをアカウント/プロファイルページにリダイレクトします。LOGIN_REDIRECT_URLを編集すると、settings.pyで指定した別のページにユーザーを送信できます。
これは素晴らしいことですが、(ログイン後)ユーザーがカスタムページにリダイレクトされ、そのページへのリンクが次のようになります:mysite.com/username
。したがって、デフォルトのアカウント/プロファイルまたはLOGIN_REDIRECT_URLの設定は、どちらも何らかの形で静的であるため、この場合は機能しません。私の場合、アドレスのusername
セクションはユーザーごとに変わります。
ユーザーがログインしたときに、アドレスにユーザー名が含まれるカスタムユーザーページに移動するための方法は次のとおりです:mysite.com/username
?どんな入力でも本当に感謝します。
次のようにユーザーを認証してログインできます。 https://docs.djangoproject.com/en/2.2/topics/auth/#how-to-log-a-user-in
これにより、ユーザーオブジェクトを取得し、そこからユーザー名を取得して、カスタムURLへのHttpResponseRedirectを実行できます。
より単純なアプローチは、ページからのリダイレクトに依存しています 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
を検索し、HttpResponseRedirect
オブジェクトを返すために必要なロジックを実行する単純なビューにします。
より良い方法は、'/simple'
のような単純なURLを定義して、そこで検索ロジックを実行することです。 URLがより美しく見えるため、作業の手間が省けます。
Djangoの組み込みLoginView
を使用している場合、コンテキストとしてnext
を取ります。これは、「成功したlogin
の後にリダイレクトするURLです。これにはクエリ文字列が含まれる場合があります。」 ( docs を参照)
また、ドキュメントから:
「ログインが成功した場合、ビューはnext
で指定されたURLにリダイレクトします。次が提供されない場合、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>
クラスベースのビューを使用する場合、別のオプションはディスパッチメソッドを使用することです。 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)
Django=に最近入り、その解決策を探していて、役に立つかもしれないメソッドを見つけました。
たとえば、allouthを使用する場合、デフォルトのリダイレクトはaccounts/profileです。次のようなユーザー名フィールドを使用して、選択した場所にのみリダイレクトするビューを作成します。
def profile(request):
name=request.user.username
return redirect('-----choose where-----' + name + '/')
次に、アプリの1つでそれをキャプチャするビューを作成します。次に例を示します。
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')
私にとってはうまくいきます。