所以我的注册表单工作正常,它成功地创建了一个新用户。但是,我的登录表单无法让用户登录。因此,当我使用正确输入的用户名/密码登录并且在我看来 print(form.non_field_errors)
时,我收到此错误:
<bound method BaseForm.non_field_errors of <UserLoginForm bound=True, valid=False, fields=(username;password)>>
谁能告诉我这是什么意思?所以登录表单无效但不确定原因。当我在同一 View 中 print(form.errors)
时,我得到了这个错误:
<ul class="errorlist"><li>username<ul class="errorlist"><li>A user with that username already exists.</li></ul></li></ul>
此外,请记住这些注册和登录功能没有单独的 url,它们都在主页上(可通过 javascript onclick 访问,以防止页面刷新)。这是我的代码:
views.py
def boxes_view(request):
...
form = UserRegistrationForm(request.POST or None)
form_login = UserLoginForm(request.POST or None)
if request.user.is_authenticated():
print('LOGGED IN')
context = {
'form': form,
'form_login': form_login
}
return render(request, 'polls.html', context)
def register(request):
form = UserRegistrationForm(request.POST or None)
if form.is_valid():
username = form.cleaned_data['username']
password = form.cleaned_data['password']
email = form.cleaned_data['email']
user = User.objects.create_user(username=username, password=password, email=email)
user.save()
return redirect('/')
else:
print(form.errors)
print(form.non_field_errors)
form = UserRegistrationForm()
return redirect('/')
def user_login(request):
form_login = UserLoginForm(request.POST or None)
if form_login.is_valid():
username = form_login.cleaned_data['username']
password = form_login.cleaned_data['password']
user = authenticate(username=username, password=password)
login(request, user)
return redirect('/')
else:
print(form_login.errors)
print(form_login.non_field_errors)
form_login = UserLoginForm()
return redirect('/')
表单.py
class UserLoginForm(forms.ModelForm):
username = forms.CharField(max_length=25)
password = forms.CharField(widget=forms.PasswordInput)
class Meta:
model = User
fields = [
'username',
'password',
]
class UserRegistrationForm(forms.ModelForm):
email = forms.EmailField()
username = forms.CharField(max_length=25)
password = forms.CharField(widget=forms.PasswordInput)
confirm_password = forms.CharField(widget=forms.PasswordInput)
class Meta:
model = User
fields = [
'username',
'email',
'password',
'confirm_password',
]
def clean(self):
email = self.cleaned_data.get('email')
current_emails = User.objects.filter(email=email)
if current_emails.exists():
raise forms.ValidationError("That email is taken")
base.html #polls.html 的父级
<form method="post" enctype="multipart/form-data" action="{% url 'user_login' %}">{% csrf_token %}
<div class="loginBox">
{{ form_login.username|placeholder:"username" }}
{{ form_login.password|placeholder:"password" }}
<input type="submit" value="login" style="margin-left: 10px"/>
</div>
</form>
<form method="post" enctype="multipart/form-data" action="{% url 'register' %}">{% csrf_token %}
<div class="registerBox">
{{ form.username|placeholder:"username" }}
{{ form.email|placeholder:"email" }}
{{ form.password|placeholder:"password" }}
{{ form.confirm_password|placeholder:"confirm password" }}
<input type="submit" value="register" />
</div>
</form>
urls.py
BV = views.boxes_view
urlpatterns = [
url(r'^$', BV, name='news'),
url(r'^admin/', admin.site.urls, name='admin'),
url(r'^post/', include('post.urls')),
url(r'^user_login/', views.user_login, name='user_login'),
url(r'^logout/', logout_view, name='logout'),
url(r'^register/', views.register, name='register'),
]
最佳答案
我认为问题在于您正在使用 ModefForm 进行登录 View 。 ModelForm 执行 validation the model instance这会引发非唯一错误。 尝试使用像这样的简单形式:
class UserLoginForm(forms.Form):
username = forms.CharField(max_length=25)
password = forms.CharField(widget=forms.PasswordInput)
关于python - 我的登录表单出现 "bound method"错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41295658/