【问题标题】:accessing uncleaned form data in form.py in django using clean() method使用 clean() 方法在 django 中访问 form.py 中未清理的表单数据
【发布时间】:2025-12-30 04:55:12
【问题描述】:

我的问题可能不清楚。所以也请阅读示例。我正在使用 python 3.4 和 django 1.7

我从表单选择字段接收到一个外键。未清理的数据给了我外来元素的 ID,但清理后的数据给了我 str(),即外来元素的名称。

我希望外部元素的对象通过与表单的另一个清理数据进行比较来验证它的另一个属性。

例如,我有一个 Institute 模型,其中包含一个 private_key( CharField )。 现在,我有一个教师模型,其中包含 Institute 作为 ForeignKey,并且需要在注册期间验证该 private_key。

注意:private_key 是 CharField 类型的变量名

在教师注册表格中,Institute 作为 ForeignKey 以及包含用户提供的 private_key 输入的 Charfield。

我必须检查存储在所选研究所模型中的用户的 private_key 输入和 private_key。如果它们不同,则引发“无效的私钥”错误。

我在 form.py 中使用 clean() 方法(在我自定义注册表单的类中)。但是在那里,我只清理了数据。干净的数据给了我研究所的名称,而不是研究所的 ID。

怎么办?

如果我的问题不好,请给出有理由的回答/评论,而不是仅仅投反对票。

【问题讨论】:

  • 请提供一些代码sn-ps以便清楚地理解您的问题
  • 我不能提供任何代码,因为 1) 我的来很复杂,因为它在同一个视图类中处理许多表单。 2)我必须在我的网站上使用它。不是开源代码,也不是实践代码

标签: django django-forms


【解决方案1】:

如果你使用ModelForm,那么你应该直接获取外键关联的对象。所以你可以在清理数据中做的是:

def clean(self):
    p_key= self.cleaned_data['private_key']
    institute= self.cleaned_data['institute']
    if p_key == institute.private_key :
        return super().clean()
    else:
        raise ValidationError('Invalid key')

如果您使用的是Form,那么您应该在清理后的数据中获取机构 ID。

【讨论】:

  • 我正在使用 ModelForm。但是 private_key 不是我的教师模型的一部分。我已经自定义了我的模型表单并插入了一个名为 private_key.Function clean_private_key(self) 的 Charfield 对我不起作用。请问您有其他解决方案吗?