Django Form Won';未显示字段时无法保存

Django Form Won';未显示字段时无法保存,django,forms,django-crispy-forms,Django,Forms,Django Crispy Forms,在DJango 1.6和crispy表单中,我在model.py中有一个名为last\u modified\u by的字段。我有一个表单,用户可以在其中修改模型的对象……但我不希望他们能够修改last\u modified\u by字段。出于某种原因,如果我不公开此字段,则表单/对象在提交后将不会保存。没有错误…页面只是简单地刷新,因为它没有成功。如果我将上次修改的在表单上公开显示,则表单保存时不会出现任何问题 这是代码的简化版本(我省略了其他字段以使其更具可读性) models.py: cla

在DJango 1.6和crispy表单中,我在model.py中有一个名为
last\u modified\u by
的字段。我有一个表单,用户可以在其中修改模型的对象……但我不希望他们能够修改
last\u modified\u by
字段。出于某种原因,如果我不公开此字段,则表单/对象在提交后将不会保存。没有错误…页面只是简单地刷新,因为它没有成功。如果我将上次修改的
在表单上公开显示,则表单保存时不会出现任何问题

这是代码的简化版本(我省略了其他字段以使其更具可读性)

models.py:

class Request(models.Model):
    ...
    last_modified_by = models.ForeignKey(settings.AUTH_USER_MODEL,
             related_name='user_last_modified', default=None,
             null=True)

在模型上,您需要将
last\u modified\u by
设置为
blank=True
。这相当于
required=False

class Request(models.Model):
    ...
    last_modified_by = models.ForeignKey(
        settings.AUTH_USER_MODEL,
        related_name='user_last_modified',
        blank=True,
        null=True,
)
class ModifyForm(CreateForm):
    date_completed = forms.DateTimeField(
        required=False,
        widget=DateTimePicker(
            options={
                "format": "YYYY-MM-DD HH:mm",
                "pickTime": True,
            }
        )
    )
如果没有
blank=True
字段,则该字段是
必需的
,并且由于您的表单没有可见的
last\u modified\u by
输入,它将
None
传递给模型。这是无效的

完成后,您应该可以继续,但为什么不将
last\u modified\u by
添加到表单
exclude
列表中呢

完成日期

我们可以;看不到您的模型,但无论
date\u completed
是否为
blank=True
,您都将通过重新声明字段在表单上覆盖它。表单字段默认为必填,因此需要设置为
required=False

class Request(models.Model):
    ...
    last_modified_by = models.ForeignKey(
        settings.AUTH_USER_MODEL,
        related_name='user_last_modified',
        blank=True,
        null=True,
)
class ModifyForm(CreateForm):
    date_completed = forms.DateTimeField(
        required=False,
        widget=DateTimePicker(
            options={
                "format": "YYYY-MM-DD HH:mm",
                "pickTime": True,
            }
        )
    )

最后,您的
clean\u date\u due
只传递了值,因此不需要(在其当前状态下,您当然可以简化为so)

我认为,您需要将
上次修改的
添加到
排除
列表中。另外,
set\u last\u modify\u by
的功能也不起作用,因为
user
在那里没有定义