django注册后如何将用户重定向到特定的url?

Posted

技术标签:

【中文标题】django注册后如何将用户重定向到特定的url?【英文标题】:How to redirect users to a specific url after registration in django registration? 【发布时间】:2013-07-16 12:53:42 【问题描述】:

所以我正在使用 django-registration 应用程序为我的网站实现用户注册页面。我使用了 Django 的 backends.simple 视图,它允许用户在注册后立即登录。我的问题是如何将它们重定向到与项目位于同一目录中的其他应用程序页面。

这是我的主要 urls.py 的样子:

from django.conf.urls import patterns, include, url

# Uncomment the next two lines to enable the admin:
# from django.contrib import admin
# admin.autodiscover()

urlpatterns = patterns('',

    url(r'^accounts/', include('registration.backends.simple.urls')),
    url(r'^upload/', include('mysite.fileupload.urls')),
    # Examples:
    # url(r'^$', 'mysite.views.home', name='home'),
    # url(r'^mysite/', include('mysite.foo.urls')),

    # Uncomment the admin/doc line below to enable admin documentation:
    # url(r'^admin/doc/', include('django.contrib.admindocs.urls')),

    # Uncomment the next line to enable the admin:
    # url(r'^admin/', include(admin.site.urls)),
)

import os
urlpatterns += patterns('',
        (r'^media/(.*)$', 'django.views.static.serve', 'document_root': os.path.join(os.path.abspath(os.path.dirname(__file__)), 'media')),
)

fileupload 是我在项目目录 mysite 中的另一个应用程序的名称。

这就是 backends.simple.urls 的样子:

"""
URLconf for registration and activation, using django-registration's
one-step backend.

If the default behavior of these views is acceptable to you, simply
use a line like this in your root URLconf to set up the default URLs
for registration::

    (r'^accounts/', include('registration.backends.simple.urls')),

This will also automatically set up the views in
``django.contrib.auth`` at sensible default locations.

If you'd like to customize registration behavior, feel free to set up
your own URL patterns for these views instead.

"""


from django.conf.urls import include
from django.conf.urls import patterns
from django.conf.urls import url
from django.views.generic.base import TemplateView

from registration.backends.simple.views import RegistrationView


urlpatterns = patterns('',
                       url(r'^register/$',
                           RegistrationView.as_view(),
                           name='registration_register'),
                       url(r'^register/closed/$',
                           TemplateView.as_view(template_name='registration/registration_closed.html'),
                           name='registration_disallowed'),
                       (r'', include('registration.auth_urls')),
                       )

这里是 backends.simple.views:

from django.conf import settings
from django.contrib.auth import authenticate
from django.contrib.auth import login
from django.contrib.auth.models import User

from registration import signals
from registration.views import RegistrationView as BaseRegistrationView


class RegistrationView(BaseRegistrationView):
    """
    A registration backend which implements the simplest possible
    workflow: a user supplies a username, email address and password
    (the bare minimum for a useful account), and is immediately signed
    up and logged in).

    """
    def register(self, request, **cleaned_data):
        username, email, password = cleaned_data['username'], cleaned_data['email'], cleaned_data['password1']
        User.objects.create_user(username, email, password)

        new_user = authenticate(username=username, password=password)
        login(request, new_user)
        signals.user_registered.send(sender=self.__class__,
                                     user=new_user,
                                     request=request)
        return new_user

    def registration_allowed(self, request):
        """
        Indicate whether account registration is currently permitted,
        based on the value of the setting ``REGISTRATION_OPEN``. This
        is determined as follows:

        * If ``REGISTRATION_OPEN`` is not specified in settings, or is
          set to ``True``, registration is permitted.

        * If ``REGISTRATION_OPEN`` is both specified and set to
          ``False``, registration is not permitted.

        """
        return getattr(settings, 'REGISTRATION_OPEN', True)

    def get_success_url(self, request, user):
        return (user.get_absolute_url(), (), )

我尝试更改 get_success_url 函数以仅返回我想要的 url,即 /upload/new,但它仍然将我重定向到 users/insert username 页面并给出错误。如何在注册后将用户重定向到其他应用程序所在的上传/新页面?

【问题讨论】:

【参考方案1】:

不要更改registration 模块中的代码。相反,子类化RegistrationView,并重写get_success_url 方法以返回您想要的url。

from registration.backends.simple.views import RegistrationView

class MyRegistrationView(RegistrationView):
    def get_success_url(self, request, user):
        return "/upload/new"

然后在您的主 urls.py 中包含您的自定义注册视图,而不是包含简单的后端 url。

urlpatterns = [
    # your custom registration view
    url(r'^register/$', MyRegistrationView.as_view(), name='registration_register'),
    # the rest of the views from the simple backend
    url(r'^register/closed/$', TemplateView.as_view(template_name='registration/registration_closed.html'),
                          name='registration_disallowed'),
    url(r'', include('registration.auth_urls')),
]

【讨论】:

MyRegistrationView 类到底应该放在哪里?它是在 backend.simple 文件夹中的 views.py 上还是在注册文件夹中的 view.py 上? 我上面说了,注册模块里的代码不要改。这将使升级到 django-registration 的下一个版本变得更加困难。您可以将类放在您自己的应用程序的views.py 之一中。如果您愿意,可以将它包含在urls.py 中,因为它只有三行。 所以我尝试了这个我将两个代码块都放在了 backends.simple.urls.py 因为,我的项目文件夹中的主 urls.py 文件调用了 simple.urls你可以从上面看到。它仍然不起作用并在注册后立即重定向到用户/用户名页面(不是登录) 我已经说过两次不要在注册模块中编辑代码。由于您仍在尝试编辑backends.simple.urls.py,因此我无法再为您提供帮助了。 我知道我不应该修改注册模块中的代码,但是我在 backends.simple.urls.py 中所做的更改应该可以正常工作吗?让我按照你的方式试一试,然后回复你。非常感谢您的帮助【参考方案2】:

我正在使用 django_registration 3.1 包。我已经发布了使用这个包所需的所有 3 个文件(views.py urls.py forms.py)。 要在成功注册时将用户重定向到自定义 url,请创建一个子类 RegistrationView 的视图。传入您选择的success_url。

Views.py:

from django_registration.backends.one_step.views import RegistrationView
from django.urls import reverse_lazy
class MyRegistrationView(RegistrationView):
    success_url = reverse_lazy('homepage:homepage')  # using reverse() will give error

urls.py:

from django.urls import path, include
from django_registration.backends.one_step.views import RegistrationView
from core.forms import CustomUserForm
from .views import MyRegistrationView

app_name = 'core'
urlpatterns = [

    # login using rest api
    path('api/', include('core.api.urls')),

    # register for our custom class
    path('auth/register/', MyRegistrationView.as_view(
        form_class=CustomUserForm
    ), name='django_registration_register'),

    path('auth/', include('django_registration.backends.one_step.urls')),
    path('auth/', include('django.contrib.auth.urls'))

]

forms.py:

from django_registration.forms import RegistrationForm
from core.models import CustomUser


class CustomUserForm(RegistrationForm):
    class Meta(RegistrationForm.Meta):
        model = CustomUser

【讨论】:

【参考方案3】:

如果你愿意,你可以修改以下文件/usr/local/lib/python2.7/dist-packages/registration/backends/simple/urls.py,改变路径,为示例:

修改前:

success_url = getattr(设置,'SIMPLE_BACKEND_REDIRECT_URL','/'),

修改后:

success_url = getattr(设置,'SIMPLE_BACKEND_REDIRECT_URL','/upload/new'),

问候。

迭戈

【讨论】:

以上是关于django注册后如何将用户重定向到特定的url?的主要内容,如果未能解决你的问题,请参考以下文章

django - 注册用户后重定向到页面

Django 注册 url 重定向

如何将用户重定向到以前的URL在Laravel中注册后

使用 django-allauth 登录信号将用户重定向到另一个 url

使用确认 URL 确认 amazon cognito 后如何重定向?

如何在访问主页时将用户重定向到特定 URL?