gpt4 book ai didi

Django:表单验证:接受一个字段的多个值

转载 作者:行者123 更新时间:2023-12-01 04:02:27 25 4
gpt4 key购买 nike

我希望创建一个表单字段,该字段为给定字段采用多个值,验证它们并将它们存储为列表。

例如,可以运行以下 curl 命令并发布几个名为“email”的 POST 参数

curl -X POST -d email=test@example.com -d email=test2@example.com http://url/here/

在我看来,我可以执行以下操作以直接从 POST 数据中获取电子邮件列表。
email = request.POST.getlist('email')

但是,我想利用表单验证来清除 POST 数据中指定的所有电子邮件。

理想情况下,我想运行 form.is_valid() 然后访问表单上的cleaned_data['email'] 键将返回有效电子邮件地址的列表。

我已经研究过使用 MultipleChoice 字段和类似的字段(因为它们接受具有相同名称的多个输入),但是这些字段要求您事先定义选择。我也考虑过使用表单集,但对于我在这种情况下尝试做的事情来说,这些似乎过于复杂。

有谁知道任何以这种方式表现的领域?谢谢阅读。

最佳答案

我正在寻找类似的东西,我发现了这个:http://djangosnippets.org/snippets/497/

from django import newforms as forms

class SeparatedValuesField(forms.Field):
"""
A Django newforms field which takes another newforms field during
initialization and validates every item in a separated list with
this field class. Please use it like this::

from django.newforms import EmailField
emails = SeparatedValuesField(EmailField)

You would be able to enter a string like 'john@doe.com,guido@python.org'
because every email address would be validated when clean() is executed.
This of course also applies to any other Field class.

You can define the sepator (default: ',') during initialization with the
``separator`` parameter like this::

from django.newforms import EmailField
emails = SeparatedValuesField(EmailField, separator='###')

If validation succeeds it returns the original data, though the already
splitted value list can be accessed with the get_list() method.

>>> f = SeparatedValuesField(forms.EmailField)
>>> f.clean('foo@bar.com,bar@foo.com')
'foo@bar.com,bar@foo.com'
>>> f.get_list()
['foo@bar.com', 'bar@foo.com']
>>> f.clean('foobar,foo@bar.com,bar@foo.com')
Traceback (most recent call last):
...
ValidationError: <unprintable ValidationError object>
>>> u = SeparatedValuesField(forms.URLField)
>>> u.clean('http://foo.bar.com,http://foobar.com')
'http://foo.bar.com,http://foobar.com'
>>> u.clean('http:foo.bar.com')
Traceback (most recent call last):
...
ValidationError: <unprintable ValidationError object>
>>> f = SeparatedValuesField(forms.EmailField, separator='###')
>>> f.clean('foo@bar.com###bar@foo.com')
'foo@bar.com###bar@foo.com'
>>> f.clean('foobar###foo@bar.com###bar@foo.com')
Traceback (most recent call last):
...
ValidationError: <unprintable ValidationError object>

"""
def __init__(self, base_field=None, separator=',', *args, **kwargs):
super(SeparatedValuesField, self).__init__(*args, **kwargs)
self.base_field = base_field
self.separator = separator

def clean(self, data):
if not data:
raise forms.ValidationError('Enter at least one value.')
self.value_list = data.split(self.separator)
if self.base_field is not None:
base_field = self.base_field()
for value in self.value_list:
base_field.clean(value)
return data

def get_list(self):
return self.value_list

def _test():
import doctest
doctest.testmod()

if __name__ == "__main__":
_test()

但这并不完全令人满意:例如,对于电子邮件列表,如果只有一封电子邮件无效,则整个字段都无效。

人们可能会重写 clean 方法,使其仅返回有效的“base_fields”,而不是完全抛出 ValidationError。

关于Django:表单验证:接受一个字段的多个值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12698474/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com