基于选择列表值的django python动态最大长度
我使用的是Django1.7和Python2.7 我有一个模型类,它允许用户输入文本区域和文本框基于选择列表值的django python动态最大长度,python,django,validation,django-models,django-forms,Python,Django,Validation,Django Models,Django Forms,我使用的是Django1.7和Python2.7 我有一个模型类,它允许用户输入文本区域和文本框 如果用户在选择列表中选择0,则文本框显示给用户输入,文本区域隐藏否则文本区域显示,文本框对用户隐藏 文本框和文本区域具有完全相同的输入。文本框中输入的内容将显示在文本区域中 文本框和文本区域都有不同的maxlength/max_length值 文本框的最大长度为250,文本区域的最大长度为5000 我有客户端验证工作,但我很难让服务器端验证工作 当文本框和文本区域具有不同的最大长度值,但输入长度相同
如果
用户在选择列表中选择0,则
文本框显示给用户输入,文本区域隐藏否则
文本区域显示,文本框对用户隐藏
文本框和文本区域具有完全相同的输入。文本框中输入的内容将显示在文本区域中
文本框和文本区域都有不同的maxlength/max_length值
文本框的最大长度为250,文本区域的最大长度为5000
我有客户端验证工作,但我很难让服务器端验证工作
当文本框和文本区域具有不同的最大长度值,但输入长度相同时,如何在forms.py文件上启用/禁用对我的模型的服务器端验证?
我知道可以在forms.py上指定max_长度,但我无法获得正确的代码语法
以下是我的models.py代码:
workplace_training_display_type = models.PositiveIntegerField(.....)
workplace_training_certificationTB = models.CharField(null=False, blank=False)
workplace_training_certificationTA = models.TextField(null=False, blank=False)
通常,我会将max_length=250
放在上述模型字段的workplace_training_certificationTB
中,将max_length=5000
放在workplace_training_certificationTA
中。但是,我认为这必须在forms.py文件中动态完成
编辑
如果我为workplace\u training\u certificationTB
和workplace\u training\u certificationTA
的模型设置了最大长度,因为这两个字段都有完全相同的输入,那么将触发一个服务器端验证,这就是我希望动态设置值的原因
以下是我的forms.py文件代码:
def clean(self):
cd_wrtdf = super(WorkplaceRelatedTrainingDetailsForm, self).clean()
if 'workplace_training_display_type' in cd_wrtdf and cd_wrtdf['workplace_training_display_type'] != 0:
# if the workplace_training_display_type is not zero, remove the max_length=250 from the textbox.
# if the workplace_training_display_type is not zero, add the max_length=5000 to the textarea.
else:
# if the workplace_training_display_type is zero, add the max_length=250 to the textbox.
# if the workplace_training_display_type is zero, remove the max_length=5000 from the textarea.
return cd_wrtdf
我尝试过搜索SO&Google,但找不到任何有用的东西。在模型上有重复的字段并不是正确的方法。您应该将模型更改为只有一个字段,即文本字段,最大长度为5000。然后在forms.py中,您可以使用
len(input)
检查输入的长度。然后,您可以根据其他选定字段确定其是否在限制范围内
在clean方法中,调用
super()
将自动检查它是否在5000以内,然后您只需检查它是否需要小于250即可。如果是,则只需查看在模型上具有重复字段的If len(input)>250:raise ValidationError(“太长,不适合键入”)
是否真的不是正确的方法。您应该将模型更改为只有一个字段,即文本字段,最大长度为5000。然后在forms.py中,您可以使用len(input)
检查输入的长度。然后,您可以根据其他选定字段确定其是否在限制范围内
在clean方法中,调用
super()
将自动检查它是否在5000以内,然后您只需检查它是否需要小于250即可。如果是,则只需查看在模型上具有重复字段的If len(input)>250:raise ValidationError(“太长,不适合键入”)
是否真的不是正确的方法。您应该将模型更改为只有一个字段,即文本字段,最大长度为5000。然后在forms.py中,您可以使用len(input)
检查输入的长度。然后,您可以根据其他选定字段确定其是否在限制范围内
在clean方法中,调用
super()
将自动检查它是否在5000以内,然后您只需检查它是否需要小于250即可。如果是,则只需查看在模型上具有重复字段的If len(input)>250:raise ValidationError(“太长,不适合键入”)
是否真的不是正确的方法。您应该将模型更改为只有一个字段,即文本字段,最大长度为5000。然后在forms.py中,您可以使用len(input)
检查输入的长度。然后,您可以根据其他选定字段确定其是否在限制范围内
在clean方法中,调用
super()
将自动检查它是否在5000以内,然后您只需检查它是否需要小于250即可。如果是,那么只需查看If len(input)>250:raise ValidationError('Too long for type')
您的模型字段中是否不能有动态长度,因为它们是在数据库级别实现的。当您在字段上设置最大长度时,它会将其转换为等效的SQL,从而限制可存储在数据库级别的数据量
正如@electro提到的,我还建议在您的模型中使用一个长度为5000的CharField
因为这似乎更像是一个用户界面问题,您应该使用Javascript来实现这一点,并根据您提到的用户选择替换所需类型的输入。只要表单输入以相同的名称发布数据,Django表单仍将按预期运行
您可以执行类似的操作,但当用户从列表中选择一个选项时,您将触发它。还要确保输入/文本区域ID和名称与表单字段相同,以便表单能够清理数据。模型字段中不能有动态长度,因为它们是在数据库级别实现的。当您在字段上设置最大长度时,它会将其转换为等效的SQL,从而限制可存储在数据库级别的数据量 正如@electro提到的,我还建议在您的模型中使用一个长度为5000的CharField 因为这似乎更像是一个用户界面问题,您应该使用Javascript来完成这项工作,并替换您输入的类型