如何在Django Registration中实现用户注册后重定向到特定URL?

11
所以我正在使用 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函数,只返回我想要的网址/upload/new,但它仍然重定向到用户/插入用户名页面并出现错误。我该如何在注册后将用户重定向到其他应用程序所在的upload/new页面?

4个回答

18

请勿更改 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中还是registration文件夹内部的views.py中? - user2476295
1
正如我之前所说,不要更改注册模块中的代码。这将使升级到下一个版本的django-registration变得更加困难。您可以将该类放在自己应用程序的views.py中。如果您愿意,也可以将其包含在urls.py中,因为它只有三行代码。 - Alasdair
所以我尝试了这个,我把这两个代码块放在backends.simple.urls.py中。由于我的项目文件夹中的主urls.py文件调用simple.urls,如上所示。但它仍然不起作用,并在注册后立即重定向到用户/用户名页面(而不是登录)。 - user2476295
2
我已经说过两次不要编辑注册模块中的代码了。既然你还在尝试编辑 backends.simple.urls.py,那么我就无法再帮助你了。 - Alasdair
我明白我不应该修改注册模块中的代码,但是我在backends.simple.urls.py中所做的更改应该可以使其正常工作,对吗?让我按照您的方式尝试一下,然后再回来告诉您。非常感谢您的帮助。 - user2476295

2
我可以帮您翻译成如下内容:

我正在使用django_registration 3.1包。我已经发布了需要使用此包的所有三个文件(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

1

0

如果您希望的话,可以修改以下文件 /usr/local/lib/python2.7/dist-packages/registration/backends/simple/urls.py,例如更改路径:

修改之前:

success_url = getattr (settings, 'SIMPLE_BACKEND_REDIRECT_URL', '/'),

修改后:

success_url = getattr (settings, 'SIMPLE_BACKEND_REDIRECT_URL', '/upload/new'),

Regards.

Diego


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接