4

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

我在Django 网站上使用Braintree Payments ,付款表单html 的信用卡号需要如下所示:

<input type="text" size="20" autocomplete="off" data-encrypted-name="number" />

我的目前看起来像这样:

<input type="text" size="20" autocomplete="off" name="number">

我可以以某种方式重命名namedata-encrypted-name吗?或者,我可以name完全隐藏/删除该属性吗?如果是这样,我可以轻松地为 Braintree-friendly 属性添加一个自定义属性:

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脆表单,所以我宁愿在我的forms.py而不是在模板中通过 html 调整来解决这个问题,以保持它干燥。

4

1 回答 1

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。

于 2013-08-08T03:27:53.953 回答