如何强制在 ModelForm 字段中输入的行数
How to enforce number of lines entered in a ModelForm field
我有一个模型表单,用户可以在其中输入他们的简历。我不希望简历超过 10 行。我想知道在哪里以及如何实现这一目标?
这是模型:
class UserProfile(models.Model):
username = models.OneToOneField(User)
name = models.CharField(max_length=30)
bio=models.TextField(blank=True)
更新:
感谢 electrometro 的回答,我在模型中添加了这个验证方法:
def enforce_bio(self):
bio = self.cleaned_data['bio']
rows = bio.split('\n')
if len(rows) > 10:
raise forms.ValidationError("bio too long!")
else:
return bio
但它不能正常工作,也就是说,它允许 bios 超过 10 行。这里有什么问题?
在验证表单时,您可以轻松地将文本按换行符的数字拆分,然后只获取该列表的长度。然后,如果它太长,您可以通过在表单清理方法上引发 ValidationError
将表单作为无效发回。
唯一的问题是它没有对数据库进行 logic/validation 检查。因此,您需要在使用表单的任何地方执行此操作。
有关更多信息,请查看 Django 表单验证 here.
编辑:
要将文本拆分成一个列表,只需 rows = text.split('\n')
,然后获取该列表的长度,它将是 rows_length = len(rows)
。那会告诉你文本有多少行。您必须在表单验证中执行此操作。
您可以这样做,例如:
def max_ten_lines(value):
rows = value.split('\n')
if len(rows) > 10:
raise ValidationError("bio too long!")
class UserProfile(models.Model):
username = models.OneToOneField(User)
name = models.CharField(max_length=30)
bio = models.TextField(blank=True, validators=[max_ten_lines])
我有一个模型表单,用户可以在其中输入他们的简历。我不希望简历超过 10 行。我想知道在哪里以及如何实现这一目标?
这是模型:
class UserProfile(models.Model):
username = models.OneToOneField(User)
name = models.CharField(max_length=30)
bio=models.TextField(blank=True)
更新: 感谢 electrometro 的回答,我在模型中添加了这个验证方法:
def enforce_bio(self):
bio = self.cleaned_data['bio']
rows = bio.split('\n')
if len(rows) > 10:
raise forms.ValidationError("bio too long!")
else:
return bio
但它不能正常工作,也就是说,它允许 bios 超过 10 行。这里有什么问题?
在验证表单时,您可以轻松地将文本按换行符的数字拆分,然后只获取该列表的长度。然后,如果它太长,您可以通过在表单清理方法上引发 ValidationError
将表单作为无效发回。
唯一的问题是它没有对数据库进行 logic/validation 检查。因此,您需要在使用表单的任何地方执行此操作。
有关更多信息,请查看 Django 表单验证 here.
编辑:
要将文本拆分成一个列表,只需 rows = text.split('\n')
,然后获取该列表的长度,它将是 rows_length = len(rows)
。那会告诉你文本有多少行。您必须在表单验证中执行此操作。
您可以这样做,例如:
def max_ten_lines(value):
rows = value.split('\n')
if len(rows) > 10:
raise ValidationError("bio too long!")
class UserProfile(models.Model):
username = models.OneToOneField(User)
name = models.CharField(max_length=30)
bio = models.TextField(blank=True, validators=[max_ten_lines])