Django表单验证未知字符串列表

时间:2016-06-09 23:02:11

标签: django django-forms django-rest-framework

我正在使用Django REST框架的API。我的一个API端点接受以下发布请求:

{
    "tokens": ["biemnxci92j3kd", "xjcivjd23djcisd"],
    ...
}

我想使用Django表单来验证此请求的参数。这是我目前的表格:

class TestForm(forms.Form):
    processors = forms.MultipleChoiceField()
    # other stuff
    ...

我的问题是MultipleChoiceField要求我提供已接受选项的列表,但我接受的字符串具有随机值,我事先并不知道它们的值。所以验证这个表格总是给我一个错误。我想到了几种可能的解决方案,但它们似乎都不起作用:

  1. 使用另一个表单字段 - 我找不到另一个可用于表示(并验证)字符串列表的字段。
  2. 创建我自己的自定义验证器 - 这仍然需要我事先将字段定义为多选字段,我不确定如何创建自己的自定义字符串列表字段。
  3. 有什么建议吗?

1 个答案:

答案 0 :(得分:1)

由于它是一个API,您可能甚至不需要使用{{ form }}呈现表单,您只需完全删除该字段,扩展clean方法,然后验证数据直接。

class TestForm(forms.Form):

    def clean(self):
        super(TestForm, self).clean()

        if 'tokens' in self.data:
            if your_logic_to_validate() is False:
                raise forms.ValidationError('Invalid tokens')

        return self.cleaned_data

即使您确实需要呈现表单,您也只能自己呈现HTML,而不是依赖于{{ form }}{{ form.tokens }}。您应该能够循环form.data.tokens来构建多选并将它们全部设置为选中(如果没有数据绑定,则不渲染任何选项)。