使用包含'。'的属性将表单绑定到HTTP请求(点/周期)

时间:2013-09-17 14:13:20

标签: django django-forms

我想要一个由第三方调用的端点,它们将使用的参数名称无法更改。提交的数据包含具有字符.(例如hub.token)的参数以及其他参数。

我曾想创建一个Django表单来验证回调,但是如何编写一个将绑定到请求的表单类。在没有注意到问题的情况下,我尝试hub.token这不起作用,因为hub字典不存在。然后我尝试hub_token,希望Django能够认出这个意图。

在属性中有句点是有效的,因为在HTML表单提交中,名称取名为can contain periods的控件名称属性。

是否有一种简单的方法可以处理这种情况而无需访问视图中的每个字段?


forms.py

from django import forms

class RegisterEndpointForm(forms.Form):
    hub.token = forms.CharField()

views.py

...
register_request = RegisterEndpointForm(request.GET)
if register_request.is_valid()
    pass
...

2 个答案:

答案 0 :(得分:0)

我不瘦你可以设置包含点的属性。你可以试试几件事。您可以将字段设置为hub_token,然后在request.GET中用下划线替换该点。例如:

data = request.GET
data['hub_token'] = data['hub.token'] 
del data['hub.token']
register_request = RegisterEndpointForm(data)
…

您还可以尝试在表单init上动态设置字段。例如:

class RegisterEndpointForm(forms.Form):
    def __init__(self, *args, **kwargs):
        super(RegisterEndpointForm, self).__init__(*args, **kwargs)
        self.fields['hub.token'] = forms.CharField()

答案 1 :(得分:0)

我使用了@jproffitt建议的__init__方法,但替换了包含带下划线的句点的所有键。

class RegisterEndpointForm(forms.Form):
    hub_verify_token = forms.CharField()
    [...]
    def __init__(self, *args, **kwargs):
        super(RegisterEndpointForm, self).__init__(*args, **kwargs)
        all_fields = self.data.copy()
        for key, value in all_fields.iteritems():
            safe_key = key.replace('.', '_')
            if safe_key != key:
                    self.data[safe_key] = value