基于选择列表值的django python动态最大长度

基于选择列表值的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 我有客户端验证工作,但我很难让服务器端验证工作 当文本框和文本区域具有不同的最大长度值,但输入长度相同

我使用的是Django1.7和Python2.7

我有一个模型类,它允许用户输入文本区域和文本框

如果
用户在选择列表中选择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来完成这项工作,并替换您输入的类型