【问题标题】:Change form input attribute 'name' to 'data-encrypted-name'将表单输入属性“名称”更改为“数据加密名称”
【发布时间】:2013-08-08 02:21:40
【问题描述】:

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

我在一个 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-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

Braintree:

重要提示:不要对任何捕获的字段使用名称属性 敏感的支付信息,例如信用卡号或 CVV。 删除此属性可防止它们访问您的服务器 纯文本,因此会缩小您的 PCI 合规范围。

另外,我使用的是 django crispy forms,所以我宁愿在我的 forms.py 中解决这个问题,而不是在模板中通过 html 调整来保持它干燥。

【问题讨论】:

    标签: django forms braintree


    【解决方案1】:

    定义一个自定义小部件类,继承自您的 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。

    【讨论】:

    • 完美,谢谢!我在这里添加了您所拥有的内容,但还必须添加from django.forms.widgets import TextInput。此外,我的表单字段现在看起来像:number = CreditCardField(required = True, label = "Card Number", widget = SensitiveTextInput(attrs={'autocomplete': 'off', 'size': 20}))。 CreditCardField 只是我从this snippet 抓取的一个自定义字段。
    • 实际上,我不能使用上面提到的CreditCardField 及其所有花哨的验证检查。 Braintree js 在提交表单之前对 CC 编号和 CVV 字段进行加密,因此验证检查失败。
    • @Banjer 所以你最终使用了普通的forms.CharField 而不是CreditCardField
    • 有用。这对于集成 Stripe 非常有用(Stripe.com - 希望这将有助于 Google 搜索)
    • @teewuane 抱歉,刚刚看到您的评论。我最终使用了 CharField。看起来像number = forms.CharField(required=True, label = "Card Number", widget = SensitiveTextInput(attrs={'autocomplete': 'off', 'size': 20}))
    猜你喜欢
    • 2014-02-04
    • 1970-01-01
    • 2015-09-22
    • 1970-01-01
    • 2011-04-25
    • 2012-01-18
    • 2020-09-01
    • 2011-09-29
    • 2014-02-14
    相关资源
    最近更新 更多