所以我们最近升级到了Django 1.4,我注意到模型表单处理带有editable = False的模型字段的方式发生了变化 .
如果我有一个用户模型:
class User(models.Model):
id = UUIDField(primary_key=True, default=uuid4str)
name = models.CharField(max_length=128)
其中UUIDField自动拥有kwargs ['editable'] = False,然后尝试制作一个模型形式:
class UserFormSelf(ModelForm):
class Meta:
model = models.User
fields = ('id', 'name',)
widgets = {
'id': HiddenInput()
}
运行时出现以下错误:
“为用户指定的未知字段(id)”
根据文档,If False, the field will not be displayed in the admin or any other ModelForm. Default is True. . 但是,由于该字段是隐藏的并且仅使用,因此我可以确定正在编辑哪个用户,应该有一种方法允许它在表单中,对吗?
我真的不希望id可以编辑,但是如果这是我可能必须的唯一解决方案 . 也许它可以编辑,但如果它不是一个新对象,那么我会引发异常 . 想知道是否有可能首先使用editable = False .
谢谢你的帮助!
编辑:显然无法检查id字段是否已编辑并在pre_save上写入自定义“editable = False”,因为pre_save会自动认为对象是新的,如果它有新ID . 如果您无法提供上述答案,但知道如何做到这一点,请告诉我 .
1 回答
为什么不自己展示 Value 呢?表单用于输入/输出,如果记录已存在,则可能是您的UUID将在您的最终计算或应用程序已知 . 它提供了您的模板代码,但是如果您使用
as_p()
来显示您的表单,只需在编辑现有对象时添加类似<p>Id: {{ object.id }}</p>
的内容 .