django forms is_valid() 方法总是返回 true 如果所有表单字段的要求都是 false

Posted

技术标签:

【中文标题】django forms is_valid() 方法总是返回 true 如果所有表单字段的要求都是 false【英文标题】:django forms is_valid() method always returning true if all the form field's required is false 【发布时间】:2022-01-23 21:57:40 【问题描述】:

models.py 创建了一个模型 registerForm.my 数据库是 mysql

from django.db import models

class registerForm(models.Model):
    name = models.CharField(max_length=50 )
    username = models.CharField( max_length=50)
    email = models.EmailField(max_length=50)
    password = models.CharField(max_length=50)
    class Meta:
        db_table = 'userForm'
    def __str__(self):
        return self.name    

forms.py

from django import forms
from django.forms import widgets
from login_and_logout.models import registerForm

class regForm(forms.ModelForm):

    def __init__(self, *args, **kwargs):
        # first call parent's constructor
        super(regForm, self).__init__(*args, **kwargs)
        # there's a `fields` property now
        self.fields['name'].required = False
        self.fields['username'].required = False
        self.fields['email'].required = False
        self.fields['password'].required = False

    class Meta: 
        model = registerForm
        fields = "__all__"

views.py

check form is valid using is_valid() method 
    def signup(request):
    
        if request.method == 'POST':
            form = regForm(request.POST)

            print(form.is_valid())
    
            if form.is_valid():
                return HttpResponse('success')
            else:
                return  HttpResponse('fail')
        form = regForm()
        return render(request, 'signup.html', 'form': form)

我尝试在客户端使用 javascript 和在 dajngo 中使用服务器端验证来实现表单验证。为了在没有必需属性的情况下实现表单验证 我在 dajngo forms.py 中给出了所需的错误信息。但是在 is_valid() 方法之后总是返回 true。但是,如果我删除了用于删除 forms.py 中所需字段的 init 函数,则 is_valid() 有效。 我想删除必填字段,也想使用 is_valid() 方法。

【问题讨论】:

is_valid 为您还可以粘贴哪些请求数据返回 True。 方法是 post 。在视图中的 is_valid() 方法之后,我使用 clean_data 方法获取值,这是输出 'name': 'sha', 'username': '', 'email': '', 'password': '' .我只是填写名称字段,其他字段在表单中留空。但验证在服务器端不起作用。如果我在 forms.py. 中使用 required false ,删除后它会起作用。设置后需要 false 是有效的,总是返回 true。 我认为您没有检查验证,这就是它返回 true 的原因 【参考方案1】:

您 print(print(form.is_valid()) 有效表单的语句没有在任何条件语句下检查是否满足保存有效表单的条件,这就是它返回 True 的原因。

 def signup(request):
        if request.method == 'POST':
            form = regForm(request.POST)
            # This where your conditional check for valid form starts from
            # So you are suppose to put the print statement below the condition if statement 
            # All the logic of validations starts from the if statement
            if form.is_valid():
                print(form.is_valid())
                data = form.save(commit=False)
                data.username = request.user 
                # whatever data that you want to check for validation  before saving it.
                data.save()
                return HttpResponse('success')
            else:
                return  HttpResponse('fail')
        form = regForm()
        return render(request, 'signup.html', 'form': form)

【讨论】:

以上是关于django forms is_valid() 方法总是返回 true 如果所有表单字段的要求都是 false的主要内容,如果未能解决你的问题,请参考以下文章

当值为空时,Django modelSerializer form.is_valid() 为真

Django:form.is_valid 检查后,cleaned_data 缺少图像字段

Django 消费者(Django 频道)中的表单数据验证(相当于 form.is_valid)

Django form.is_valid() 总是假的

Django form.is_valid() 失败的基于类的视图 - Form、SingleObject、DetailMixins

django form.is_valid 返回 false