Django 更改表单输入属性';名称';至';数据加密名称';

Django 更改表单输入属性';名称';至';数据加密名称';,django,forms,braintree,Django,Forms,Braintree,这是一个棘手的标题问题,所以请在假设它是重复的之前阅读:) 我在Django网站上使用,信用卡号的html需要如下所示: <input type="text" size="20" autocomplete="off" data-encrypted-name="number" /> 仅供参考,我在\uuuuu init\uuuuu中尝试过这一点,但没有成功: self.fields['number'].widget.attrs['name'] = None Per

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

我在Django网站上使用,信用卡号的html需要如下所示:

<input type="text" size="20" autocomplete="off" data-encrypted-name="number" />
仅供参考,我在
\uuuuu init\uuuuu
中尝试过这一点,但没有成功:

         self.fields['number'].widget.attrs['name'] = None
Per:

重要提示:不要对捕获的任何字段使用name属性 敏感的支付信息,如信用卡号或CVV。 删除此属性可防止它们在中命中您的服务器 纯文本,因此减少了您的PCI合规范围


另外,我使用的是django,所以我更喜欢在我的
forms.py中解决这个问题,而不是在模板中使用html调整来保持干燥。

定义一个自定义小部件类,该类继承您的
number
字段默认为的任何小部件类型(
TextInput
,从您显示的标记判断)并重写其
build\u attrs
方法

我会这样做:

<input type="text" size="20" autocomplete="off" name="number">
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。

太好了,谢谢!我在这里添加了您所拥有的内容,但还必须添加来自django.forms.widgets import TextInput的
。另外,我的表单字段现在看起来像:
number=CreditCardField(required=True,label=“Card number”,widget=sensitivetemput(attrs={'autocomplete':'off','size':20}))
。CreditCardField只是我从中获取的一个自定义字段。实际上,我不能使用上面提到的
CreditCardField
,也不能使用它所有奇特的验证检查。Braintree js在提交表单之前加密了CC number和CVV字段,因此验证检查失败。@Banjer那么你最终使用了常规的
表单。CharField
而不是
CreditCardField
?很有用。这对于整合Stripe(Stripe.com-希望这能帮助谷歌搜索)来说非常棒@teewuane抱歉,刚刚看到你的评论。我最终使用了查菲尔德。它看起来像
number=forms.CharField(required=True,label=“Card number”,widget=sensitivetemput(attrs={'autocomplete':'off','size':20}))
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