在Django Model Form中包含一个editable = False字段作为HiddenInput

时间:2012-11-19 22:19:39

标签: django django-models django-forms

所以我们最近升级到了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 个答案:

答案 0 :(得分:1)

为什么不自己显示价值?表单用于输入/输出,如果记录已存在,则可能是您的UUID将在您的最终计算或应用程序已知。由于您没有提供模板代码,因此我很难给出一个示例,但如果您使用as_p()来显示您的表单,那么只需添加类似<p>Id: {{ object.id }}</p>的内容即可。编辑现有对象。