python - 我的登录表单出现 "bound method"错误

标签 python django django-forms django-views

所以我的注册表单工作正常,它成功地创建了一个新用户。但是,我的登录表单无法让用户登录。因此,当我使用正确输入的用户名/密码登录并且在我看来 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/

相关文章:

javascript - 将 Javascript 函数转换为 python

python - Django Social Auth - 用户已创建,配置文件已创建,但用户未登录

python - 从数据库模式生成自定义表单

Django 预填表格

django - 如何使用 UserCreationForm 类在用户注册页面使用 python-TZ 添加时区下拉列表

python - 如何在 Python 中输入 "fool"鸭子类型(duck typing)

python - 将字符串转换为 ISO 日期 python

django - 如何在 django 中使用 $.post ?

python - 有没有办法将列表中的元素插入到第二个列表中的每个第 kn 个位置?

python - 如何在 python 中固定随机生成器?