我正在使用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_certificationTB
和workplace_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&谷歌,但找不到任何有用的东西。
答案 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与表单字段相同,这样才能通过表单清理数据。