Django表单不会保存字段不显示

时间:2014-04-16 15:39:05

标签: django forms django-crispy-forms

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

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

    class ModifyForm(CreateForm):
        date_completed = forms.DateTimeField(
            widget=DateTimePicker(options={"format": "YYYY-MM-DD HH:mm",
                                              "pickTime": True}))

        class Meta:
            model = Request
            exclude = ('emails_sent',)

        def __init__(self, *args, **kwargs):
            super(ModifyForm, self).__init__(*args, **kwargs)
            #even  though this field is marked 
            #not required, this widget makes it...so:
            self.fields['date_completed'].required = False
            self.helper.layout = Layout(
                Fieldset(
                   ....
                ),
                FormActions(
                    Submit('submit', 'Submit', css_class='btn-primary')
                )
            )

        def get_date_if_not_Set(self):
            if not self.fields['date_completed']:
                self.fields['date_completed'] = datetime.datetime.now(pytz.utc)
                self.save()

        #This is needed because a person won't be able to submit a modified form 
        #with a previous date already set
        def clean_date_due(self):
            date = self.cleaned_data['date_due']
            return date

        def set_last_modify_by(self):
            self.last_modified_by = user.pk
            self.save()

models.py:

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

2 个答案:

答案 0 :(得分:1)

在模型上,您需要将last_modified_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,
)

如果没有blank=True,则该字段为required,并且由于您的表单没有可见的last_modified_by输入,它会将None传递给模型。这是无效的。

完成后,您应该很高兴,但为什么不将last_modified_by添加到表单exclude列表中。

<强> date_completed

我们无法看到您的模型,但是date_completed是否blank=True,您可以通过重新声明字段来覆盖表单。表单字段默认为必填,因此您需要设置为required=False

class ModifyForm(CreateForm):
    date_completed = forms.DateTimeField(
        required=False,
        widget=DateTimePicker(
            options={
                "format": "YYYY-MM-DD HH:mm",
                "pickTime": True,
            }
        )
    )

最后你的clean_date_due只传递了值,所以不需要(在当前状态下,你当然可以简化为SO)

答案 1 :(得分:1)

我认为,您需要将last_modified_by添加到exclude列表中。函数set_last_modify_by也不起作用,因为那里user未定义。