将表单输入属性“name”更改为“data-encrypted-name”

时间:2013-08-08 02:21:41

标签: django forms braintree

这对标题来说是一个棘手的问题,所以请在假设重复之前阅读:)。

我在Django网站上使用Braintree Paymentspayment 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

Braintree

  

重要提示:请勿对捕获的任何字段使用name属性   敏感的付款信息,如信用卡号或CVV。   删除此属性可防止他们访问您的服务器   纯文本等会降低您的PCI合规范围。

另外,我使用的是django crispy forms,因此我更倾向于在我的forms.py中解决此问题,而不是在模板中使用html调整以保持DRY。

1 个答案:

答案 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。