1

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

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

在属性中有句点是有效的,因为在 HTML 表单提交中,名称是可以包含句点的控件名称属性。

有没有一种简单的方法来处理这种情况而不必访问视图中的每个字段?


表格.py

from django import forms

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

视图.py

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

4

2 回答 2

0

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

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

您也可以尝试在表单初始化时动态设置字段。例如:

class RegisterEndpointForm(forms.Form):
    def __init__(self, *args, **kwargs):
        super(RegisterEndpointForm, self).__init__(*args, **kwargs)
        self.fields['hub.token'] = forms.CharField()
于 2013-09-17T15:47:06.560 回答
0

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

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
于 2013-09-18T09:19:38.913 回答