一尘不染

覆盖Django表单字段的名称attr

django

我建立了一个Django表单,该表单提交到另一个域(我不控制)上的页面。我的想法是,我有一个样式优美,生成得很好的表单,可以很好地适合我自己的网站,并且在提交用户时将用户带到其他地方。

然而,

  • 如果其他表单更改了其任何字段的名称,则我需要更改表单中的字段名称,然后在应用程序中的其他位置更改这些名称-因为nameattr与用于该属性的属性的名称相关联领域。
  • 如果远程表单使用愚​​蠢的名称,那么我的表单对象还必须具有带有愚蠢名称的属性,这会污染我的应用程序的代码。
  • 如果这些名称恰巧是Python中的保留字(例如from),那么很难或不可能创建Django表单对象表示形式。
    显示字段时,是否有办法指定用于’name’属性的其他字符串?因此,将HTML表单与表示它的类分离。

这将需要两个组件:

  1. 覆盖小部件中的名称值
  2. 使表单在绑定时从request.POST读取此值
    在这种情况下,我只需要第1步,但是第2步与解决上面列出的问题有关

阅读 526

收藏
2020-04-03

共1个答案

一尘不染

这是对API的一种非常可怕的滥用,但是有一个名为form的方法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)
2020-04-03