当前位置: 首页 > 面试题库 >

覆盖Django表单字段的名称attr

吕鸿朗
2023-03-14
问题内容

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

然而,

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

这将需要两个组件:

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

问题答案:

这是对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)


 类似资料:
  • 问题内容: 我有一个自定义TagField表单字段。 如上所示,它使用TextInput表单字段小部件。但是在管理员中,我希望使用Textarea小部件来显示它。为此,存在钩子,但在这种情况下不起作用。 管理员声明为: 这对表单字段窗口小部件没有影响,并且仍使用TextInput小部件呈现。 问题答案: django管理员对其许多字段使用自定义窗口小部件。覆盖字段的方法是创建一个供ModelAdm

  • 问题内容: 假设我有一个继承自SuperFoo的模型Foo: 在Foo类中,我想重写SuperFoo的name字段的verbose_name。我可以吗?如果不是,最好的选择是在模型表单定义内设置标签以使其显示在模板中吗? 问题答案: 我使用的一个简单的技巧是:

  • 我正在使用Spring Boot网络流量r2dbc来实现REST应用编程接口服务器。 为模型生成的模式正在复制具有不同定义(名称、限制等)的同一字段。 我的模型: 路由器 为扩展模型生成的OpenAPI模式 我有两个字段:tenant_id和tenantId,但这在模型中是同一个字段。还要注意,tenantId的定义忽略了模式属性(如required和pattern属性)。 我遗漏了一些注释?似乎

  • 问题内容: 在Django管理员中,我想覆盖并实现自己的模型形式(例如发票模型)。 我希望发票表单具有用于客户名称,产品名称的自动填写字段,并且我还想进行自定义验证(例如客户的信用额度)。如何覆盖Django管理员提供的默认格式并实现自己的默认格式? 问题答案: 如何根据docs在django admin中覆盖表单:

  • 问题内容: 我正在使用org.hibernate.cfg.ImprovedNamingStrategy,但是对于表我已经明确指定了表名 但是hibernate似乎正在寻找event_log。显式命名不应该覆盖EnhancedNamingStrategy提供的命名 问题答案: 这是org.hibernate.cfg.ImprovedNamingStrategy的行为,它将混合大小写的名称转换为嵌入的

  • 问题内容: 假设有一个文件夹“ / home / user / temp/a40bd22344”。名称是完全随机的,并且在每次迭代中都会更改。我需要能够使用固定名称(例如“ project”)在Python中导入此文件夹。我知道我可以将此文件夹添加到sys.path中以启用导入查找,但是有没有一种方法可以将“a40bd22344”替换为“项目”? 也许 init .py有一些聪明的技巧? 添加: