5

到目前为止,我的注册表单和登录表单位于两个不同的页面上,我似乎无法将它们放在一个视图中,因为我这样做的方式,视图需要不同的返回语句。所以这是我的注册视图功能:

def register_user(request):
    if request.method == 'POST':
        form = MyRegistrationForm(request.POST)
        if form.is_valid():
            form.save()
            return HttpResponseRedirect('/accounts/register_success')

    args = {}
    args.update(csrf(request))

    args['form'] = MyRegistrationForm()

    return render_to_response('register.html', args)

def register_success(request):
         return render_to_response('register_success.html')

这是我的登录和身份验证视图:

def login(request):
    c = {}
    c.update(csrf(request))
    return render_to_response('login.html', c)

def auth_view(request):
    username = request.POST.get('username', '')
    password = request.POST.get('password', '')
    user = auth.authenticate(username=username, password=password)

    if user is not None:
        auth.login(request, user)
        return HttpResponseRedirect('/accounts/loggedin')
    else:
        return HttpResponseRedirect('/accounts/invalid')

这是登录页面的模板:

            <form action="/accounts/auth/" method="post">{% csrf_token %}
                <label for="username">User name:</label>
                <input type="text" name="username" value="" id="username">
                <label for="password">Password:</label>
                <input type="password" name="password" value="" id="password">

                <input type="submit" value="login" />

            </form>

这是注册页面的模板:

<h2>Register</h2>
<form action="/accounts/register/" method="post">{% csrf_token %}
{{form}}

<input type="submit" value="Register" />

</form>

同样,我似乎无法将它们放在一起,因为视图必须返回不同的东西..关于如何做的任何想法?

编辑:这是我的 urls.py:

url(r'^admin/', include(admin.site.urls)),
url(r'^$', index),
url(r'^accounts/auth/$', auth_view),
url(r'^invalid/$', invalid_login),
url(r'^accounts/register/$', register_user),
url(r'^accounts/register_success/$', register_success),

因此,如果 url 是帐户/注册,它只会使用 register_user 视图,如果它是主页(^$),我希望它使用 register_view 视图。我的索引视图是这样的:

def index(request):
    c = {}
    c.update(csrf(request))
    return render_to_response('index.html', c)

它基本上只是在我的 index.html 中添加了一个 csrf 令牌(登录模板,如上所示)。这就是为什么我希望能够以某种方式合并索引和 register_user 视图,因为 register_user 视图调用注册模板中使用的实际表单 = MyRegistrationForm(request.POST) (注册模板使用 {{form}}

4

2 回答 2

7

如果您只想在同一页面上显示登录和注册。创建一个包含两个表单的 html 页面。其中一个对 url 的操作'/accounts/register/',另一个对'/accounts/auth/'.

例如,将您的 register.html 更改为:

<html>
    <head><body>
        <form action="/accounts/auth/" method="post">{% csrf_token %}
            <label for="username">User name:</label>
            <input type="text" name="username" value="" id="username">
            <label for="password">Password:</label>
            <input type="password" name="password" value="" id="password">

            <input type="submit" value="login" />

        </form>
        <h2>Register</h2>
        <form action="/accounts/register/" method="post">{% csrf_token %}
            {{form}}

            <input type="submit" value="Register" />

        </form>
    </body>
</html>

提交表单时,它将转到相应的视图并根据该视图进行重定向。

编辑:要传递一个MyRegistrationForm实例,您可以view按如下方式更新索引:

def index(request):
    c = {}
    c.update(csrf(request))
    c.update({'form':MyRegistrationForm()})
    return render_to_response('index.html', c)

在答案中使用上述 html 代码的 login.html。

于 2013-07-28T09:59:51.710 回答
0

你可以借助一点点 Javascript 来做到这一点。让我们首先创建一个输入字段:

<input type="hidden" name="button-name" id="button-name" value="" />

<input type="submit" name="register-button" id="register-button" onclick="changeValue()" />

function changeValue(){
   document.getElementById('button-name').value="register"
}

现在,在你看来,这样做:

button_name = request.POST['button-name']

if button-name=='register':
    # Do the registration
    # Redirect to another view or template

else:
    # Do your login thing
    # Redirect where you want
于 2013-08-06T07:24:20.603 回答