1 回答
TA贡献1859条经验 获得超6个赞
或if 'signup' in request.POST:
都不会elif 'login' in request.POST:
在您的视图中触发index()
,因为您的 HTML 表单实际上并不包含这些输入。请注意,该name
元素已弃用该<form>
属性。
相反,您可以在表单<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下LoginView)而不是视图对象。更新后的视图函数将如下所示:
from django.contrib.auth.forms import AuthenticationForm
def index(request):
if request.method == 'POST':
form = UserRegisterForm(request.POST)
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:
log_view = auth_views.LoginView.as_view(template_name='main/index.html')
log_view(request)
else:
form = UserRegisterForm()
formlog = AuthenticationForm(request)
return render(request, 'main/index.html', {'form': form, 'formlog': formlog})
请注意,这可以通过在登录凭据无效时提供反馈来改进。事实上,如果提供的凭据不起作用,此更新的代码只会重新加载空白登录表单。
添加回答
举报