django python动态max_length基于选择列表值

时间:2015-09-25 09:29:31

标签: python django validation django-models django-forms

我正在使用django 1.7& python 2.7。

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

If用户在选择列表中选择0,then文本框会显示给用户进行输入,文本区域隐藏else显示文本区域并且用户隐藏的文本框。

文本框和文本区域都具有完全相同的输入。输入文本框的内容将出现在文本区域,反之亦然。

文本框和文本区域都有不同的maxlength / max_length值。

文本框的最大长度为250,文本区域的最大长度为5000。

我的客户端验证工作正常,但我很难让服务器端验证工作。

当文本框和文本区域的max_length值不同但输入长度相同时,如何在forms.py文件上启用/禁用服务器端验证?

我知道可以在forms.py上分配max_length,但是我无法使代码语法正确。

这是我的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文件中动态完成。

修改 如果我将max_length设置为workplace_training_certificationTBworkplace_training_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&谷歌,但找不到任何有用的东西。

2 个答案:

答案 0 :(得分:2)

模型上有重复的字段并不是真正做到这一点的正确方法。您应该将模型更改为只有一个字段,即文本字段,最大长度为5000.然后在forms.py中,您可以使用len(input)检查输入的长度。然后,您可以根据其他选定字段确定它是否在限制范围内。

在你的干净方法中,调用super()会自动检查它是否在5000之内,然后你只需检查它是否需要小于250.如果是,那么只需查看{{ 1}}。

答案 1 :(得分:1)

模型字段中不能包含动态长度,因为这些是在数据库级别实现的。在字段上设置最大长度时,它会将其转换为等效的SQL,以限制可以存储在数据库级别的数据量。

正如@electrometro所提到的,我还建议你的模型中有一个长度为5000的CharField。

由于这似乎更像是一个用户界面问题,您应该使用Javascript执行此操作,并根据您提到的用户选择替换所需类型的输入。只要表单输入发布具有相同名称的数据,Django表单仍将按预期运行。

您可以执行与this toggle behavior类似的操作,但当用户从列表中选择一个选项时,您将触发它。还要确保input / textarea id和name与表单字段相同,这样才能通过表单清理数据。