- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试进行表单验证,以便某些字段只接受某些类型的输入,例如姓名只接受字母,电话号码只接受 10 个数字。我尝试对名字进行验证,如下所示:
#forms.py
class StudentForm(forms.ModelForm):
# STEP 1 FORM
student_id = forms.CharField(max_length=128, label="Student ID")
first_name = forms.CharField(max_length=128, label="First Name", widget=forms.TextInput(attrs={'class': 'form-control'}))
last_name = forms.CharField(max_length=128, label="Last Name")
ssn = USSocialSecurityNumberField(widget=forms.TextInput(attrs={'class': 'form-control'}), label="SSN", help_text="Format: xxx-xx-xxxx")
gender = forms.ChoiceField(widget=forms.Select(attrs={'class': 'form-control'}), label="Gender", choices=GENDER_CHOICES)
dob = forms.DateField(widget=forms.DateInput(attrs={'class': 'form-control'}), label="Date of birth", help_text="Format: yyyy-mm-dd")
contact_number = forms.CharField(max_length=128, label="Contact number")
address = forms.CharField(max_length=128, label="Address")
city = forms.CharField(max_length=128, label="City")
state = forms.ChoiceField(choices=STATE_CHOICES, initial="NJ", label="State")
zipcode = USZipCodeField(label="Zipcode")
country = forms.ChoiceField(choices=countries, label="Country", initial="US")
home_phone = forms.CharField(max_length=128, label="Home phone")
cell_phone = forms.CharField(max_length=128, label="Cell phone")
email = forms.EmailField(widget=forms.EmailInput(attrs={'class': 'form-control'}), max_length=254, validators=[validate_email], label="Email")
background = forms.ChoiceField(choices=BACKGROUND_CHOICES, label="Background")
location = forms.ChoiceField(choices=LOCATION_CHOICES, initial="south_plainfield", label="Location")
workforce = forms.ChoiceField(choices=WORKFORCE_CHOICES, initial="--", label="Workforce")
source = forms.ChoiceField(choices=SOURCE_CHOICES, initial="individual", label="Source")
refer_by = forms.ChoiceField(choices=REFER_BY_CHOICES, initial="no refer", label="Refer by")
last_status = forms.ChoiceField(choices=LAST_STATUS_CHOICES, initial="followup", label="Last status")
newsletter = forms.BooleanField(widget=forms.CheckboxInput(), label="Newsletter", required=False)
created_by = forms.CharField(max_length=128, label="Created by")
date = forms.DateField(widget=forms.DateInput(attrs={'class': 'form-control'}), label="Date", help_text="Format: yyyy-mm-dd")
notes = forms.CharField(widget=forms.Textarea(attrs={'class': 'form-control'}), required=False, label="notes", help_text="less than 1000 characters")
def clean(self):
cleaned_data = self.cleaned_data
first_name = cleaned_data.get('first_name')
if first_name.isalpha == False:
raise forms.ValidationError('Please enter a real name.')
elif first_name[0].isupper() == False or first_name[1:].isupper() == True:
raise forms.ValidationError('Please capitalize properly')
else:
cleaned_data['first_name'] = first_name
return cleaned_data
class Meta:
model = Student
fields = ('student_id', 'first_name', 'last_name', 'ssn', 'gender', 'dob', 'contact_number', 'address', 'city', 'state', 'zipcode', 'country', 'home_phone', 'cell_phone', 'email', 'background', 'location', 'workforce', 'source', 'refer_by', 'last_status', 'newsletter', 'created_by', 'date', 'notes')
但是,当提交表单时,它完全忽略了它,我的数据库浏览器显示可以接受一个带有数字的名称。是不是我哪里写错了,还是说除了forms.py,我还要改其他地方的代码?我觉得如果我能解决这个验证,那么其他验证应该更容易,但如果有人能告诉我确保表单中的电话号码只有 10 个数字的正确方法,那也很好。谢谢。
最佳答案
你不调用方法 isalpha:
if first_name.isalpha == False:
您创建了一个内置方法对象 isalpha,它永远不是 False。我认为这只是一个错字,这样写:
if first_name.isalpha():
... # your code
要验证电话号码,请使用方法 clean_phone:
def clean_phone(self):
phone = self.cleaned_data['phone']
if not phone.isdigit():
raise forms.ValidationError('Phone number can only contains digits')
elif len(phone) != 10:
raise forms.ValidationError('Length of phone number must be 10 digits')
return phone
编辑
完全正确,您不必在 forms.py 文件中描述字段,您应该在 models.py 中进行描述,但是一些特殊的,例如 first_name 必须只包含您可以在 forms.py 中描述的字母。
首先,在 models.py 中创建一个具有所有数据库约束(字段类型、最大长度、选择、唯一值等)的 Student 模型。考虑到 django 会自动创建 id 字段。
# models.py
class Student(models.Model):
first_name = models.CharField(max_length=128)
last_name = models.CharField(max_length=128)
# Type of gender field depends on type of keys you used in GENDER_CHOICES
# CharField for chars, IntegerField for integers
gender = models.CharField(choices = GENDER_CHOICES, max_length=5)
...
# Here you could validate your phone number length
# But you still have to check it for valide symbols (in forms.py)
phone = models.CharField(max_length = 10)
# and so on for all your fields
之后,在 forms.py 中定义您的 StudetForm。您不必用约束来描述所有学生字段。
# forms.py
from models import Student
class StudentForm(forms.ModelForm):
class Meta:
model = Student
fields = '__all__' # Django adds all fields you've described in Student
# Then you could rename you fields labels, otherwise django will use names of model fields
labels = {
'first_name': 'First Name',
'last_name': 'Last Name',
...
}
# And you also can override widgets for rendering.
# This feature could be useful for dates, because django default widget for DateField is TextInput.
widgets = {
'date': forms.SelectDateWidget,
}
# Now you could describe all validation methods
def clean_first_name(self):
first_name = self.cleaned_data['first_name']
if not first_name.isalpha():
return ValidationError('First name must contain only letters')
return first_name
关于python - 如何在 Django 中进行表单验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44749156/
我需要将文本放在 中在一个 Div 中,在另一个 Div 中,在另一个 Div 中。所以这是它的样子: #document Change PIN
奇怪的事情发生了。 我有一个基本的 html 代码。 html,头部, body 。(因为我收到了一些反对票,这里是完整的代码) 这是我的CSS: html { backgroun
我正在尝试将 Assets 中的一组图像加载到 UICollectionview 中存在的 ImageView 中,但每当我运行应用程序时它都会显示错误。而且也没有显示图像。 我在ViewDidLoa
我需要根据带参数的 perl 脚本的输出更改一些环境变量。在 tcsh 中,我可以使用别名命令来评估 perl 脚本的输出。 tcsh: alias setsdk 'eval `/localhome/
我使用 Windows 身份验证创建了一个新的 Blazor(服务器端)应用程序,并使用 IIS Express 运行它。它将显示一条消息“Hello Domain\User!”来自右上方的以下 Ra
这是我的方法 void login(Event event);我想知道 Kotlin 中应该如何 最佳答案 在 Kotlin 中通配符运算符是 * 。它指示编译器它是未知的,但一旦知道,就不会有其他类
看下面的代码 for story in book if story.title.length < 140 - var story
我正在尝试用 C 语言学习字符串处理。我写了一个程序,它存储了一些音乐轨道,并帮助用户检查他/她想到的歌曲是否存在于存储的轨道中。这是通过要求用户输入一串字符来完成的。然后程序使用 strstr()
我正在学习 sscanf 并遇到如下格式字符串: sscanf("%[^:]:%[^*=]%*[*=]%n",a,b,&c); 我理解 %[^:] 部分意味着扫描直到遇到 ':' 并将其分配给 a。:
def char_check(x,y): if (str(x) in y or x.find(y) > -1) or (str(y) in x or y.find(x) > -1):
我有一种情况,我想将文本文件中的现有行包含到一个新 block 中。 line 1 line 2 line in block line 3 line 4 应该变成 line 1 line 2 line
我有一个新项目,我正在尝试设置 Django 调试工具栏。首先,我尝试了快速设置,它只涉及将 'debug_toolbar' 添加到我的已安装应用程序列表中。有了这个,当我转到我的根 URL 时,调试
在 Matlab 中,如果我有一个函数 f,例如签名是 f(a,b,c),我可以创建一个只有一个变量 b 的函数,它将使用固定的 a=a1 和 c=c1 调用 f: g = @(b) f(a1, b,
我不明白为什么 ForEach 中的元素之间有多余的垂直间距在 VStack 里面在 ScrollView 里面使用 GeometryReader 时渲染自定义水平分隔线。 Scrol
我想知道,是否有关于何时使用 session 和 cookie 的指南或最佳实践? 什么应该和什么不应该存储在其中?谢谢! 最佳答案 这些文档很好地了解了 session cookie 的安全问题以及
我在 scipy/numpy 中有一个 Nx3 矩阵,我想用它制作一个 3 维条形图,其中 X 轴和 Y 轴由矩阵的第一列和第二列的值、高度确定每个条形的 是矩阵中的第三列,条形的数量由 N 确定。
假设我用两种不同的方式初始化信号量 sem_init(&randomsem,0,1) sem_init(&randomsem,0,0) 现在, sem_wait(&randomsem) 在这两种情况下
我怀疑该值如何存储在“WORD”中,因为 PStr 包含实际输出。? 既然Pstr中存储的是小写到大写的字母,那么在printf中如何将其给出为“WORD”。有人可以吗?解释一下? #include
我有一个 3x3 数组: var my_array = [[0,1,2], [3,4,5], [6,7,8]]; 并想获得它的第一个 2
我意识到您可以使用如下方式轻松检查焦点: var hasFocus = true; $(window).blur(function(){ hasFocus = false; }); $(win
我是一名优秀的程序员,十分优秀!