我已经在Stack Overflow上看到了与此相似的其他问题,但却非常不同,所以请不要这么快就投票结束。从本质上讲,我一直在尝试按照我在网上每个教程中找到的技术制作一个非常简单的登录表单。出于某种原因,填写并提交表单不会返回任何POST请求数据。这是我的代码:
查看
def signon(request):
if request.method == 'POST':
form = SignOnForm(request.POST)
if form.is_valid():
username = form.cleaned_data['username']
password = form.cleaned_data['password']
user = authenticate(username = username, password = password)
logger.info(user)
return HttpResponse('Username: {} Password {}'.format(username, password))
return HttpResponse("Error {}".format(request.POST))
if request.method == 'GET':
form = SignOnForm()
return render(request, 'signon.html', {'form': form})
模板
<!DOCTYPE html>
<html lang = "en">
<head>
<meta charset = "UTF-8">
<title>Sign into Account</title>
</head>
<body>
<form method = "POST">
{% csrf_token %}
{{ form }}
<input type = "submit" value = "Sign In">
</form>
</body>
</html>
表格
class SignOnForm(forms.ModelForm):
password = forms.CharField(widget = forms.PasswordInput)
class Meta:
model = User
fields = ['username', 'password']
我使用Django提供的User
类,并且由于某种原因提交完成的表单,没有返回POST数据,因此is_valid
总是失败。有什么想法吗?
答案 0 :(得分:0)
尝试按照这样的方式编辑视图,
def signin(request):
if request.method == 'POST':
form = SignOnForm(request.POST)
if form.is_valid():
username = form.cleaned_data.get('username')
password = form.cleaned_data.get('password')
user = authenticate(username=username, password=password)
if user is not None:
login(request, user)
return redirect('url of some page')
return HttpResponse("Error {}".format(form.errors)
else:
form = SignOnForm()
return render(request, 'signon.html', dict(form=form))
答案 1 :(得分:0)
我想我已经发现了这个问题。模型表单一旦完成就会保留数据。因此,此表单未能成功创建具有现有用户名的重复用户,这是它所面临的错误。
解决方案是什么?继承forms.Form
而不是forms.ModelForm
并手动列出用户名和密码字段。您不应将模型附加到表单以避免此错误。这可能是最新版本中的一个新功能,因为我从未见过它。