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
选项是最好的。我试图避免重复字段名,因此用下划线替换了所有句点。