Django -登录后,将用户重定向到他的自定义页面--> mysite.com/username

lawou6xi  于 2023-06-07  发布在  Go
关注(0)|答案(9)|浏览(389)

默认情况下,登录后django会将用户重定向到帐户/个人资料页面,或者如果您编辑了LOGIN_REDIRECT_URL,您可以将用户发送到您在settings.py中指定的另一个页面。
这是伟大的,但我希望用户(登录后)被重定向到一个自定义页面,该页面的链接看起来像这样:mysite.com/username。因此,默认帐户/配置文件或LOGIN_REDIRECT_URL设置在这种情况下将不起作用,因为两者都是静态的。在我的例子中,地址的username部分对每个用户都有变化。
任何想法,我如何才能使它,所以当用户登录将去一个自定义的用户页面,有用户的名字在地址一样:mysite.com/username

bbmckpt7

bbmckpt71#

一种更简单的方法依赖于从页面LOGIN_REDIRECT_URL重定向。要实现的关键是用户信息自动包含在请求中。
假设:

LOGIN_REDIRECT_URL = '/profiles/home'

你已经配置了一个urlpattern:

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

然后,您需要为视图home()编写的所有内容是:

from django.http import HttpResponseRedirect
from django.urls 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-profiles,NAME_OF_PROFILE_VIEW可以是'profiles_profile_detail'。

eimct9ow

eimct9ow2#

您可以按照以下说明对用户进行身份验证和登录:https://docs.djangoproject.com/en/dev/topics/auth/default/#how-to-log-a-user-in
这将给予您能够访问User对象,您可以从中获取用户名,然后对自定义URL执行HttpResponseRedirect。

s6fujrry

s6fujrry3#

是的!在您的settings.py中定义以下内容

LOGIN_REDIRECT_URL = '/your-path'

让'/your-path'成为一个简单的View,它查找self.request.user并执行任何需要返回HttpResponseRedirect对象的逻辑。
更好的方法可能是定义一个简单的URL,如'/simple',在那里执行查找逻辑。URL看起来更漂亮,为您节省了一些工作等。

yb3bgrhw

yb3bgrhw4#

如果你使用的是Django内置的LoginView,它将next作为上下文,即“成功login后重定向到的URL。这也可能包含一个查询字符串。”(参见文档)
也来自docs:
“如果登录成功,视图将重定向到next中指定的URL。如果没有提供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>
pinkon5k

pinkon5k5#

当使用基于类的视图时,另一个选择是使用调度方法。https://docs.djangoproject.com/en/2.2/ref/class-based-views/base/
示例代码:

  • 设置.py*
LOGIN_URL = 'login'
LOGIN_REDIRECT_URL = 'home'
  • url.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)
tct7dpnv

tct7dpnv6#

我实际上更喜欢@Stu和其他人提到的方法,即创建一个新的URL和视图,以便我们可以将重定向逻辑放在那里。这更容易,用户也可以在浏览器中输入example.com/profile,以重定向到example.com/profile/username/的个人资料。
但另一种不需要定义额外URL的方法是扩展LoginView并使用profile视图的URL名称进行重定向。
假设我们有两个名为accountspages的应用程序,我们在pages应用程序中定义了配置文件页面,如下所示:

# pages/views.py
from django.views.generic import View
from django.http import HttpResponse

class ProfileView(View):
    def get(self, request, username):
        return HttpResponse('Hello ' + username + '!')

URLConf:

# pages/urls.py
from django.urls import path
from .views import ProfileView

app_name = 'pages'
urlpatterns = [
    path('profile/<str:username>/', ProfileView.as_view(), name='profile')
]

请注意,我们必须定义app_name = 'pages',因为我们需要它来引用pages应用程序的URL。
然后,在accounts应用中,我们扩展了LoginView并添加了重定向逻辑:

# accounts/views.py
from django.contrib.auth.views import LoginView
from django.urls import reverse

class CustomLoginView(LoginView):
    def form_valid(self, form):
        self.success_url_kwargs = {'username': form.cleaned_data['username']}
        return super().form_valid(form)

    def get_success_url(self):
        # 'pages:profile' refers to the 'profile' path in the 'pages' app.
        return reverse('pages:profile', kwargs=self.success_url_kwargs)
# accounts/urls.py
from django.urls import path, include
from .views import CustomLoginView

urlpatterns = [
    path('accounts/login/', CustomLoginView.as_view(), name='login'),
    path('accounts/', include('django.contrib.auth.urls'))
]

成功登录后,将调用form_valid()方法,并将希望在配置文件URL中使用的参数添加到自定义类属性success_url_kwargs中。最后,调用return super().form_valid(form)首先使用户登录,然后重定向到get_success_url()方法(参见code)给出的URL,我们定义该方法以返回所需的自定义URL。
请注意,我们在自定义登录URL之后包含了auth应用程序的URL,以便在我们想要访问accounts/login/时解决第一个URL。
另外,如果我们需要访问用户模型示例,我们可以调用form.get_user()。这在某些情况下可能是有用的。例如,如果用户使用电子邮件登录,我们需要他的用户名,我们可以执行form.get_user().username

2nbm6dog

2nbm6dog7#

最近我进入了django,并一直在寻找解决方案,并找到了一个可能有用的方法。
例如,如果使用allouth,默认重定向是accounts/profile。使用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')

对我来说很好。

cl25kdpy

cl25kdpy8#

对我很有效

from django.shortcuts import redirect

return redirect('path/to/login/?next=/custompageurl/{}'.format(username))
iibxawm4

iibxawm49#

{% if redirect_field_value == None %}
<input type="hidden" name="{{ redirect_field_name }}" value="/LOGIN_REDIRECT_URL(instead of typing in settings.py file)/">
{% else %}
<input type="hidden" name="{{ redirect_field_name }}" value="{{redirect_field_value}}">
{% endif %}

将此代码放在登录html页面中。例如,如果您直接访问登录页面(例如:/accounts/login/),则“next”值将为None,即登录后,它不知道您必须重定向到哪个页面,直到您在设置页面中指定“LOGIN_REDIRECT_URL”(例如:LOGIN_REDIRECT_URL=/dashboard/)。如果您在设置页面中指定'LOGIN_REDIRECT_URL',如示例所示,则登录后它将重定向到'/dashboard/' url。
如果您需要访问另一个也需要登录才能查看的url(例如:/items/).所以当您访问'localhost:8000/items/',因为它需要登录查看它将重定向到'localhost:8000/accounts/login/?next=/items/'.在这里,“next”的值将是“items”,但问题是,当您在设置页面中指定“LOGIN_REDIRECT_URL”时,它总是在登录后重定向到/dashboard/ url。
因此,上面的html代码有助于重定向,如果'next'值为None,那么它将转到我们指定为隐藏输入值的页面。如果'next'不是None,那么它将根据'next'的值重定向

相关问题