Django注册|改变行为

时间:2016-08-17 18:28:48

标签: python django python-3.x django-views django-1.9

成功注册后,用户将被重定向到模板'registration_done.html'。

有没有办法更改此行为以将用户重定向到注册页面并显示消息?

我在下面尝试了这些代码,尝试了不同的方法来改变它,但在不同的情况下会有不同类型的错误。

urls.py

 url(r'^register/$',
        views.register,
        {
            'success_url': '/accounts/register/?success=true'
        },
        name='register'),

view.py

def register(request):
    if request.method == 'POST':
        user_form = UserRegistrationForm(request.POST)
        if user_form.is_valid():
            # Create a new user object but avoid saving it yet
            new_user = user_form.save(commit=False)
            # Set the chosen password
            new_user.set_password(user_form.cleaned_data['password'])
            # Save the User object
            new_user.save()
            success = request.GET.get('success', None)
            return render(request, {'new_user': new_user, 'success': success})
    else:
        user_form = UserRegistrationForm()
    return render(request, 'account/register.html', {'user_form': user_form})

registration.html

{% if success %}
      <p>{% trans 'Successfull registration!' %}</p>
{% endif %}

我做错了什么?!

错误

Traceback (most recent call last):
  File "C:\Python34\lib\site-packages\django\core\handlers\base.py", line 149, in get_response
    response = self.process_exception_by_middleware(e, request)
  File "C:\Python34\lib\site-packages\django\core\handlers\base.py", line 147, in get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
TypeError: register() got an unexpected keyword argument 'success_url'
[18/Aug/2016 14:17:55] "GET /en/account/register/ HTTP/1.1" 500 59886

1 个答案:

答案 0 :(得分:1)

您正试图将kwarg success_url传递给您的函数register

您的函数register(request)只接受一个参数:&#39;请求&#39;。

所以你可以接受第二个参数,比如success_url,就像这样

def register(request, success_url):
    ...

但是如果success_url是常量,那就没有意义。在这种情况下,只需将其定义为寄存器功能

即可
def register(request): 
    success_url = 'foo'

这里的另一点是你要reverse that url,而不是硬编码。

此外,我不确定您为什么要使用此功能:

success = request.GET.get('success', None)

任何用户都可以在GET请求中提交自己的成功变量。你是否期望从表格中得到这个?如果用户只能说在request.GET。

中成功,则看起来像是一个安全漏洞

目前您还没有成功渲染模板,因为您在第一次render电话中缺少模板名称/路径。

所以要么添加模板,要么将它们重定向到另一个页面。

相关问题