这对标题来说是一个棘手的问题,所以请在假设重复之前阅读:)。
我在Django网站上使用Braintree Payments,payment form html需要看起来像这样的信用卡号:
<input type="text" size="20" autocomplete="off" data-encrypted-name="number" />
我现在看起来像这样:
<input type="text" size="20" autocomplete="off" name="number">
我能以某种方式将name
重命名为data-encrypted-name
吗?或者,我可以完全隐藏/删除name
属性吗?如果是这样,我可以轻松地为Braintree友好属性添加自定义属性:
class SignupForm(forms.Form):
...snip...
def __init__(self, *args, **kwargs):
super(SignupForm, self).__init__(*args, **kwargs)
self.fields['number'].widget.attrs['data-encrypted-name'] = "number"
仅供参考我在__init__
尝试了这一点,但没有运气:
self.fields['number'].widget.attrs['name'] = None
重要提示:请勿对捕获的任何字段使用name属性 敏感的付款信息,如信用卡号或CVV。 删除此属性可防止他们访问您的服务器 纯文本等会降低您的PCI合规范围。
另外,我使用的是django crispy forms,因此我更倾向于在我的forms.py
中解决此问题,而不是在模板中使用html调整以保持DRY。
答案 0 :(得分:9)
定义一个自定义窗口小部件类,继承自numbers
字段默认为(TextInput
的任何窗口小部件类型,从您正在显示的标记判断)并覆盖其build_attrs
方法。
我会这样做:
class SensitiveTextInput(TextInput):
def build_attrs(self, extra_attrs=None, **kwargs):
attrs = super(SensitiveTextInput, self).build_attrs(extra_attrs, **kwargs)
if 'name' in attrs:
attrs['data-encrypted-name'] = attrs['name']
del attrs['name']
return attrs
如果您需要为少数几种小部件类型执行此操作,则可以将其抽象为mixin。