问题描述
我想使用现成的Django LoginView,但是同时我必须使用自己的视图在同一HTML模板中进行注册。如果在urls.py文件中,我将连接2个视图,而不是仅首先连接。所以我的问题是,如何在我自己的视图中使用LoginView并在Jinja中使用2种形式? 这是我的views.py文件和html;)
def index(request):
if request.method == 'POST':
form = UserRegisterForm(request.POST)
formlog = auth_views.LoginView.as_view(template_name='main/index.html')
if 'signup' in request.POST:
if form.is_valid():
form.supervalid()
form.save()
username = form.cleaned_data.get('username')
messages.success(request,f'Dear {username} you have been created a new accound!')
return redirect('main')
elif 'login' in request.POST:
if formlog.is_valid():
formlog.save()
username = form.cleaned_data.get('username')
messages.success(request,f'Your account has been created! You are now able to log in')
return redirect('main')
else:
form = UserRegisterForm()
formlog = auth_views.LoginView.as_view(template_name='main/index.html')
return render(request,'main/index.html',{'form': form,'formlog': formlog})
# this code is not working,but not returning any errors
HTML
{% if not user.is_authenticated %}
<!-- Login -->
<div class="container">
<div class="log-1">
<div class="log-0">
<p class="logtitle">BareTalk</p>
<form method="POST" name="login">
{% csrf_token %}
{{ formlog|crispy }}
<button class="log-button first" type="submit">Login</button>
</form>
<button class="log-button second"
onclick="modalwindowops.open();" id="signup">Sign Up</button>
</div>
</div>
</div>
<!-- Signup -->
<div class="modal-overlay">
<div class="modal-window">
<span class="close-modal" onclick="modalwindowops.close();">×</span>
<form method="POST" name="signup">
<p>Sign Up</p>
{% csrf_token %}
{{ form|crispy }}
<button type="submit">Sign Up</button>
</form>
</div>
</div>
{% else %}
<h1>Welcome back Amigo!</h1>
{% endif %}
解决方法
if 'signup' in request.POST:
视图中不会触发elif 'login' in request.POST:
和index()
,因为您的HTML表单实际上并不包含这些输入。请注意,name
元素的<form>
属性是deprecated。
相反,您可以在表单中添加隐藏的<input>
,如下所示:
<form method="POST">
{% csrf_token %}
{{ formlog|crispy }}
<input type="hidden" name="login" value="true" />
<button class="log-button first" type="submit">Login</button>
</form>
还
formlog = auth_views.LoginView.as_view(template_name='main/index.html')
将视图保存到formlog
,而不是表单,因此调用formlog.is_valid()
会导致错误。
代替
elif 'login' in request.POST:
if formlog.is_valid():
formlog.save()
username = form.cleaned_data.get('username')
messages.success(request,f'Your account has been created! You are now able to log in')
return redirect('main')
您可能只需要做
elif 'login' in request.POST:
log_view = auth_views.LoginView.as_view(template_name='main/index.html')
log_view(request)
调用is_valid()
,save()
并进行重定向已全部由LoginView
完成。如果您仍要执行自定义message.success()
,则必须覆盖一个或多个LoginView
方法,但这是另一个主题。
更新:
您还需要将视图formlog = auth_views.LoginView.as_view(template_name='main/index.html')
(在return render...
之前)更改为:
formlog = AuthenticationForm(request)
将此行带到else
块之外。
还要在views.py
顶部为表单添加导入:
from django.contrib.auth.forms import AuthenticationForm
此更改是必需的,因为模板需要表单对象(默认为AuthenticationForm
的{{1}})而不是视图对象。更新的视图功能将如下所示:
LoginView
请注意,当登录凭据无效时,可以通过提供反馈来改善这一点。照原样,如果提供的凭据不起作用,此更新的代码只会重新加载空白的登录表单。