我应该将哪个Django表单字段类型用于值数组?

2024-10-03 11:22:08 发布

您现在位置:Python中文网/ 问答频道 /正文

我在SPA的POST数据中接收到一个数组,最多包含N个uuid4值。然后,我应该输入一个删除指定对象实例的视图:

<QueryDict: {'uuids[]' : [
    'a1a241bd-147f-4672-86d7-1a6225b8080e'
    '791db3f0-5134-4927-b328-347c7261d7f6'
    'b8087a1b-710e-47b4-af5a-bae4d5e30532'
    '6d1a96b2-1b99-4707-a8e3-376a0d596d95'
    ...
]}>

据我所知,MultiValueField可能并不打算处理这些数据,因为我不想“压缩”它。django如何处理这样的表单数据?我是否应该自己手动处理request.POST,并通过表单运行每个uuid来验证它吗?或者重写form.clean()?在


Tags: 数据对象实例视图表单数组postspa
2条回答

我决定使用一个自定义字段并重写post()。如果有更好的方法,我们将非常感谢您的评论/编辑。在

在表单.py

import uuid
from django.core.exceptions import ValidationError
MAX_UUIDS = 10
class UUIDArrayField(forms.Field):
    """ Custom field representing an array of up to MAX_UUIDS uuid4 strings """
    def clean(self, value):
        if type(value) != type([]):
            raise ValidationError(self.error_messages['not_a_list'])
        if len(value) > MAX_UUIDS:
            raise ValidationError(self.error_messages['too_many_values'])
        try:
            for v in value:
                print(v)
                uuid.UUID(v, version=4) # ValueError if not a valid uuid4
            return value
        except:
            raise ValidationError(self.error_messages['invalid_uuid'])


class ObjectMultiDeleteForm(forms.Form):
    """ form to delete multiple products """

    uuids = UUIDArrayField(
        error_messages = {
            'not_a_list': _("A data type other than list was supplied."),
            'too_many_values': _("The list of values exceeds the maximum allowed."),
            'invalid_uuid': _("An invalid identifier was specified."),
        })

在视图.py

^{pr2}$

在这种情况下,你最好写一个小模型,你可以把它放在另一个地方:

class UUIDItem(models.Model):
    request = models.PositiveIntegerField()
    uuid = models.UUID()

您可以很容易地将其与另一个模型联系起来:

^{pr2}$

有了这种抽象级别,您就可以轻松地列出、修改并向现有请求添加UUID,或者创建一个不同的“存储”

l = UUIDList()
l.add(your_uuids)
l.id # will print some id
UUIDItem.objects.filter(request=l.request).all()

呃,你好。处理UUID列表

相关问题 更多 >