覆盖Django表单字段的名称attr

ada*_*ish 15 python forms django

我已经构建了一个Django表单,提交到另一个域的页面(我无法控制).我的想法是,我有一个很好的风格,整齐生成的形式,整齐地适合我自己的网站,并在提交时将用户带到其他地方.

然而,

  • 如果该其他表单更改了其任何字段的名称,我需要更改表单中字段的名称,然后在我的应用程序中的其他位置更改这些名称 - 因为nameattr已耦合到用于该字段的属性的名称领域.
  • 如果远程表单使用愚​​蠢的名称,那么我的表单对象也必须具有愚蠢名称的属性,这会污染我的应用程序的代码.
  • 如果这些名称碰巧是Python中的保留字(例如from),则很难或不可能创建Django表单对象表示.

有没有办法在显示字段时指定用于'name'属性的不同字符串?因此,将HTML表单与表示它的类分离.

这需要两个组件:

  1. 覆盖窗口小部件中的名称值
  2. 使表单在绑定时从request.POST读取此值

在这种情况下我只需要步骤1,但步骤2与更一般地解决上面列出的问题相关

Dan*_*man 29

这是一个非常可怕的API滥用,但有一个调用的表单方法add_prefix被调用来确定每个字段的HTML名称应该是什么,考虑到表单的前缀(如果有的话).您可以覆盖它,以便它在某个字典中查找字段名称并返回您想要的名称 - 不要忘记保留现有的前缀行为:

FIELD_NAME_MAPPING = {
    'field1': 'html_field1',
    'field2': 'html_field2'
}

class MyForm(forms.ModelForm):
    def add_prefix(self, field_name):
        # look up field name; return original if not found
        field_name = FIELD_NAME_MAPPING.get(field_name, field_name)
        return super(MyForm, self).add_prefix(field_name)
Run Code Online (Sandbox Code Playgroud)

  • 老实说,这是将近四年前的事了,我不记得我为什么这么想。 (3认同)

Gar*_*Jax 6

我已经实现了一个简单的函数,它覆盖了widget render方法并分配了一个自定义名称:

def namedWidget(input_name, widget=forms.CharField):
    if isinstance(widget, type):
        widget = widget()

    render = widget.render

    widget.render = lambda name, value, attrs=None: \
        render(input_name, value, attrs)

    return widget
Run Code Online (Sandbox Code Playgroud)

用法很简单:

class AliasCreationForm(forms.Form):
    merchant_id = forms.CharField(
        max_length=30,
        widget=namedWidget('PSPID', forms.HiddenInput),
    )
Run Code Online (Sandbox Code Playgroud)