简体   繁体   English

为什么Django form.is_valid()总是为false

[英]why Django form.is_valid() always false

I'm writing a login code. 我正在写一个登录代码。 but form.is_valid() always false I don't know why? 但是form.is_valid()总是false我不知道为什么?

model.py 模型

class User(models.Model):
    Man = 'M'
    Woman = 'W'
    GENDER_CHOICES=(
        (Man, 'M'),
        (Woman, 'W'),
    )
    user_no = models.AutoField(primary_key=True)
    user_email = models.EmailField(max_length=254)
    user_pw = models.CharField(max_length=50)
    user_gender = models.CharField(
        max_length=1,
        choices=GENDER_CHOICES,
        default=Man,
    )
    user_birthday = models.DateField(blank=True)
    user_jdate = models.DateTimeField(auto_now_add=True)

signin.html signin.html

<form method="post" action="{% url 'signin' %}">
{% csrf_token %}
<h3>ID : {{form.user_email}} </h3>
<h3>PASSWORD : {{form.user_pw}} </h3>


<input type="submit" class="btn_submit" value="로그인" />

views.py views.py

def signin(request):
if request.method == 'POST':
    form = Form(request.POST)
    if form.is_valid():
        print("success")
    else:
        print("false")
else:
    form = Form()
return render(request,'signin.html',{'form':form})

1) What's wrong? 1)怎么了?

2)The other signups are true because the signup_bails are true, but why is the signin always false? 2)其他签约为true,因为signup_bails为true,但为什么签约始终为false?

3)How do I fix it? 3)如何解决?

I'd suggest a couple of things. 我建议一些事情。 First of, you need to define your Form Object first. 首先,您需要首先定义表单对象。 If you did and you are importing this form, then please submit it here to review. 如果您这样做了,并且正在导入此表单,请在此处提交以进行审核。

If you're interested in creating your own User Model, why don't you extend Django's User model. 如果您对创建自己的用户模型感兴趣,为什么不扩展Django的用户模型。 It already comes with all features like login, groups and permissions. 它已经具有所有功能,如登录,组和权限。 Maybe you'd like other properties besides the Django User's Model. 也许您想要Django用户模型之外的其他属性。 You can add this attributes within your extended model. 您可以在扩展模型中添加此属性。

app/models.py app / models.py

from django.contrib.auth.models import AbstractBaseUser, PermissionsMixin, UserManager, AbstractUser


class User(AbstractUser):

    def __init__(self, *args, **kwargs):
        super(User, self).__init__(*args, **kwargs)
        is_active = models.BooleanField(default=True)
        is_admin = models.BooleanField(default=False)
        is_staff = models.BooleanField(default=False)

    def get_short_name(self):
        return self.username

    def __str__(self):
        if self.first_name and self.last_name:
            name = self.first_name + " " + self.last_name
        else:
            name = self.username
        return name

    def __unicode__(self):
        return self.email

In this example you can see I've extended my custom 'User' Model to AbstractUser from django.contrib.auth.models, this means I can use all attributes from Django's User model but also I added three more fields (is_active, is_admin, is_staff). 在此示例中,您可以看到我已经将自定义的“用户”模型从django.contrib.auth.models扩展到AbstractUser,这意味着我可以使用Django用户模型的所有属性,但还添加了另外三个字段(is_active,is_admin, is_staff)。

Dont forget to register this new extended Model to settings.py 不要忘记将这个新的扩展模型注册到settings.py

settings.py settings.py

 AUTH_USER_MODEL = 'app.User'

Now let say you'd like to update User instances from your User Model. 现在,假设您要从用户模型更新用户实例。 Let's use a Form that its based on this User model. 让我们使用一个基于此User模型的Form。

app/forms.py app / forms.py

from django import forms 
from .models import User


class UpdateUserForm(forms.ModelForm):

    class Meta():
        model = User

Now to lets use this form in your views.py 现在让我们在您的views.py中使用此表单

app/views.py app / views.py

from .models import User
from .forms import UpdateUserForm
from django.shortcuts import get_object_or_404


def update_user(request, id):
    _user = get_object_or_404(User, id=id)
    form = UpdateUserForm(instance=_user)
    template = 'app/template.html'
    if request.method == 'POST':
       form = UpdateUserForm(request.POST, instance=_user)
       if form.is_valid():
           form.save()
    context = {
        'form':form
    }
    return render(request, template, context)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM