【问题标题】:How to declare a form field in Django, if it has the same name as a Python keyword?如果表单字段与 Python 关键字同名,如何在 Django 中声明表单字段?
【发布时间】:2011-12-07 17:08:45
【问题描述】:

我在 Django 中有一个简单的表单,看起来像这样:

class SearchForm(forms.Form):
    text = forms.CharField()
    from = forms.DateField()
    until = forms.DateField()

因为 from 是 Python 关键字而失败并出现 SyntaxError。

我宁愿不更改字段的名称;它比任何替代品都更适合,而且我对最终用户的外观很挑剔。 (表单使用 'GET',因此字段名称在 URL 中可见。)

我意识到我可以改用 from_ 之类的东西,但我最初认为可能有某种方法可以显式提供字段名称,例如这种情况。 (例如,通过在 Field 构造函数中提供name='whatever' 参数。)结果是there isn't

目前我正在使用dynamic form generation 来解决这个问题,这还不算太糟糕,但它仍然有点小技巧......

class SearchForm(forms.Form):
    text = forms.CharField()
    from_ = forms.DateField()
    until = forms.DateField()

    def __init__(self, *args, **kwargs):
        super(SearchForm, self).__init__(*args, **kwargs)
        self.fields['from'] = self.fields['from_']
        del self.fields['from_']

有没有更优雅的方式来拥有一个名为 from 的表单字段或任何其他 Python 关键字?

【问题讨论】:

  • 将单词大写?我很确定关键字只是小写。
  • 类似的事情是在 init 中设置标签 ...stackoverflow.com/questions/636905/django-form-set-label
  • 标签是文本描述,而不是使用的查询参数,所以这不起作用。
  • 所以问题假设您使用表单 action=GET?
  • 我认为添加一个带有 http 表单字段名称的额外字段参数将是表单字段类的一个很好的新功能。

标签: python django


【解决方案1】:

不要用关键词来命名,即使你找到了变通的方法,它也可能最终会咬你。

使用同义词或添加前缀/后缀。

例如
start -> finish
begin -> end
date_from -> date_to

【讨论】:

  • 我同意,如果它不是最终用户可见的差异。我宁愿不根据我碰巧用于后端代码的语言的语义来决定我的 URL 对最终用户的外观。
猜你喜欢
  • 2016-03-27
  • 2023-03-25
  • 1970-01-01
  • 2010-09-30
  • 1970-01-01
  • 1970-01-01
  • 2017-04-04
  • 2019-12-07
  • 2011-02-04
相关资源
最近更新 更多