clean 方法中的 Django 表单验证问题

Django form validation problem in clean method

提问人:PAVAN KUMAR 提问时间:9/13/2023 最后编辑:PAVAN KUMAR 更新时间:9/13/2023 访问量:51

问:

我是 Django 的新手。在这里,每当我提交表单时,即使我在填写表单时犯了错误,也没有出现验证错误,并且验证错误在前端也不可见。尽快寻求帮助

views.py

from django.shortcuts import render
from testform import form
from django.http import HttpResponse

# Create your views here.

def studentform(request):
    studentrecord=form.Student()
    data={'data':studentrecord}

    if request.method=='POST':
        studentrecord=form.Student(request.POST)
        if studentrecord.is_valid():
           print('validating')
           
           print('sname',studentrecord.cleaned_data['Name'])     
        
        
           print('sloc',studentrecord.cleaned_data['location'])
           print('smail',studentrecord.cleaned_data['mail'])                                   
       

    else:
        print('form is not valid')
        
    return HttpResponse('thanks for form filling')

return render (request,'testform/try.html',context=data)

form.py

from django import forms

class Student(forms.Form):
    Name=forms.CharField()
    location=forms.CharField()
    mail=forms.EmailField()
    course=forms.CharField()


     def clean(self):
         total_clean=super().clean()
         inputname=total_clean['Name']
         if len(inputname)<5:
            raise forms.ValidationError('Type the name in below 5 letters')
    
        input_location=total_clean['location']
        if input_location =='Antartica':
           raise forms.ValidationError('Antartica is not valid')
    
         input_course=total_clean['course']

         if input_course not in ['python','java']:
            raise forms.ValidationError('select either python or java')
Django django-forms 验证错误

评论

1赞 willeM_ Van Onsem 9/13/2023
请包含代码,而不是代码的图像:请参阅提问时为什么不上传代码错误的图像编辑问题并使用代码示例按钮 () 包含代码片段。{}
0赞 Vinita Sonakiya 9/13/2023
您的消息是在控制台上打印“表单无效”
0赞 PAVAN KUMAR 9/13/2023
@VinayVishwakarma 是的,它表明表格并非一直有效!你能检查一下是否存在任何错误吗
0赞 PAVAN KUMAR 9/13/2023
@VinayVishwakarma <h1>欢迎填写表单</h1> <表单 action=“” method=“post” class=“forms”> {{data.as_p}} {% csrf_token %} <input type=“submit” role=“button” value=“Submit”> </form>
0赞 PAVAN KUMAR 9/13/2023
@VinayVishwakarma你能告诉在哪里添加{{form.errors}}

答:

0赞 Vinita Sonakiya 9/13/2023 #1

我认为您错过了在 html 文件中添加表单错误标签。 添加了类似这样的东西。

<body>
   <!-- your html elements -->
      {{form.errors}}
</body>

评论

0赞 PAVAN KUMAR 9/13/2023
嘿,我在你的回答中添加了我的代码。你能告诉我在哪里添加{{form.errors}}吗?
0赞 Vinita Sonakiya 9/14/2023
您需要将其添加到 try.html 文件中。
0赞 PAVAN KUMAR 9/14/2023
仍然显示错误
0赞 willeM_ Van Onsem 9/13/2023 #2

视图逻辑将始终显示表单已正确填写,即使填写不正确。

def studentform(request):
    if request.method == 'POST':
        studentrecord = form.Student(request.POST)
        if studentrecord.is_valid():
            print('validating')
            print('sname', studentrecord.cleaned_data['Name'])
            print('sloc', studentrecord.cleaned_data['location'])
            print('smail', studentrecord.cleaned_data['mail'])
            return HttpResponse('thanks for form filling')
    else:
        studentrecord = form.Student()
    data = {'data': studentrecord}
    return render(request, 'testform/try.html', context=data)

在表单中,您还应该返回清理后的数据:

从 Django 导入表单

from django import forms


class Student(forms.Form):
    # …

    def clean(self):
        total_clean = super().clean()
        inputname = total_clean['Name']
        if len(inputname) < 5:
            raise forms.ValidationError('Type the name in below 5 letters')

        input_location = total_clean['location']
        if input_location == 'Antartica':
            raise forms.ValidationError('Antartica is not valid')

        input_course = total_clean['course']

        if input_course not in ['python', 'java']:
            raise forms.ValidationError('select either python or java')
        return total_clean

评论

0赞 PAVAN KUMAR 9/13/2023
嘿,还是行不通。.每当我提交包含错误数据的表单时,它都会在控制面板中显示(执行其他部分)表单无效。当我提交包含正确数据的表格时,它会显示(如果部分,则为部分)感谢您的填写。.主要问题是,每当我输入错误的数据时,它都不会警告用户(我在验证错误中提到的语句),并且错误在前端也不可见
0赞 willeM_ Van Onsem 9/13/2023
@PAVANKUMAR:该部分应与 绑定,因此不应与 绑定,因此它应该在“外部”范围内。elseif request.method == 'POST'form.is_valid()
0赞 PAVAN KUMAR 9/13/2023
还是同样的问题..错误未出现在前端。.每当我提交带有错误数据的表单时(它以其他方式执行),如果我使用正确的数据提交(它会转到我编码的其他页面)。但是每当我在前端输入错误的数据时,验证错误都不会出现在表单顶部,也不会出现在控制面板中
0赞 willeM_ Van Onsem 9/13/2023
@PAVANKUMAR:它不应该计算 ,这就是缩进很重要的原因。它应该停在这条线上,然后继续这条线。你有调试器吗?elseif studentrecord.is_valid()data = ...
0赞 PAVAN KUMAR 9/13/2023
是的,我确实有 django 调试器工具栏