所以我们最近升级到了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。如果您无法提供上述答案,但知道如何做到这一点,请告诉我。
答案 0 :(得分:1)
为什么不自己显示价值?表单用于输入/输出,如果记录已存在,则可能是您的UUID将在您的最终计算或应用程序已知。由于您没有提供模板代码,因此我很难给出一个示例,但如果您使用as_p()
来显示您的表单,那么只需添加类似<p>Id: {{ object.id }}</p>
的内容即可。编辑现有对象。