【问题标题】:Django Form Won't Save With Field Not ShowingDjango 表单不会保存字段不显示
【发布时间】:2014-05-31 14:19:57
【问题描述】:

在 DJango 1.6 和脆形式中,我在 model.py 中有一个名为 last_modified_by 的字段。我有一个表单,用户可以在其中修改模型的对象......但我不希望他们能够修改 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)

【问题讨论】:

    标签: django forms django-crispy-forms


    【解决方案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 进行了简化)

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 2015-08-20
        • 2021-11-10
        • 2012-11-28
        • 2018-03-21
        • 2016-07-14
        • 2020-09-05
        • 1970-01-01
        • 2022-01-24
        相关资源
        最近更新 更多