web-dev-qa-db-ja.com

Django-ログイン後、ユーザーをカスタムページにリダイレクトします-> mysite.com/username

ログイン後のデフォルトでは、Django=はユーザーをアカウント/プロファイルページにリダイレクトします。LOGIN_REDIRECT_URLを編集すると、settings.pyで指定した別のページにユーザーを送信できます。

これは素晴らしいことですが、(ログイン後)ユーザーがカスタムページにリダイレクトされ、そのページへのリンクが次のようになります:mysite.com/username。したがって、デフォルトのアカウント/プロファイルまたはLOGIN_REDIRECT_URLの設定は、どちらも何らかの形で静的であるため、この場合は機能しません。私の場合、アドレスのusernameセクションはユーザーごとに変わります。

ユーザーがログインしたときに、アドレスにユーザー名が含まれるカスタムユーザーページに移動するための方法は次のとおりです:mysite.com/username?どんな入力でも本当に感謝します。

40
avatar

次のようにユーザーを認証してログインできます。 https://docs.djangoproject.com/en/2.2/topics/auth/#how-to-log-a-user-in

これにより、ユーザーオブジェクトを取得し、そこからユーザー名を取得して、カスタムURLへのHttpResponseRedirectを実行できます。

9
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_を「profiles_profile_detail」にすることができます。

68
Stu

はい! settings.pyで以下を定義します

LOGIN_REDIRECT_URL = '/your-path'

'/ your-path'をself.request.userを検索し、HttpResponseRedirectオブジェクトを返すために必要なロジックを実行する単純なビューにします。

より良い方法は、'/simple'のような単純なURLを定義して、そこで検索ロジックを実行することです。 URLがより美しく見えるため、作業の手間が省けます。

6
Jarvis Jones

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>
3
kimbo

クラスベースのビューを使用する場合、別のオプションはディスパッチメソッドを使用することです。 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)
2
Cliff Robbins

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

私にとってはうまくいきます。

0
mromanda