Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django 将表单绑定到属性包含';的HTTP请求';(点/句点)_Django_Django Forms - Fatal编程技术网

Django 将表单绑定到属性包含';的HTTP请求';(点/句点)

Django 将表单绑定到属性包含';的HTTP请求';(点/句点),django,django-forms,Django,Django Forms,我希望有一个由第三方调用的端点,他们将使用的参数名不能更改。提交的数据包含字符(例如hub.token)以及其他参数 我本来想创建一个Django表单来验证回调,但是如何编写一个绑定到请求的表单类呢。在没有注意到问题的情况下,我尝试了hub。不作为hub字典工作的令牌不存在。然后,我尝试了hub_token,希望Django能意识到这一意图 在属性中有一个句点是有效的,因为在HTML表单提交中,名称采用控件名称属性,而控件名称属性是有效的 是否有一种简单的方法来处理这种情况,而不必访问视图中的每

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

我本来想创建一个Django表单来验证回调,但是如何编写一个绑定到请求的表单类呢。在没有注意到问题的情况下,我尝试了
hub。不作为
hub
字典工作的令牌不存在。然后,我尝试了
hub_token
,希望Django能意识到这一意图

在属性中有一个句点是有效的,因为在HTML表单提交中,名称采用控件名称属性,而控件名称属性是有效的

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


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
...


我不知道,您可以设置包含点的属性。你可以试试看。您可以将字段设置为
hub\u 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()
您还可以尝试在表单init上动态设置该字段。例如:

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()

我使用了@jproffitt建议的
\uuuuu init\uuuu
方法,但将所有包含句点的键替换为下划线

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

谢谢,我认为from
\uuuu init\uuu
选项是最好的。我试图避免重复字段名,因此用下划线替换了所有句点。