截至目前,我在两个不同的页面上都有我的注册表单和登录表单,我似乎无法将它们放在一个视图中,因为我这样做,视图需要不同的返回语句。所以这是我的注册视图功能:
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是accounts / register,它只会使用register_user视图,如果它是主页(^ $),我希望它使用register_view视图。我的索引视图是:
def index(request):
c = {}
c.update(csrf(request))
return render_to_response('index.html', c)
它基本上只是将一个csrf标记添加到我的index.html(登录模板,如上所示)。这就是为什么我希望能够以某种方式合并索引和register_user视图,因为register_user视图调用在注册模板中使用的实际form = MyRegistrationForm(request.POST)(注册模板使用{{form}}
答案 0 :(得分:8)
如果您只想在同一页面上显示登录和注册。创建一个包含两个表单的html页面。其中一个的行为是'/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)
在答案中使用login.html作为上面的html代码。
答案 1 :(得分: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