【问题标题】:Django forms with clean_field(self) return empty element on raise带有 clean_field(self) 的 Django 表单在 raise 时返回空元素
【发布时间】:2015-01-23 17:51:01
【问题描述】:

我以这种方式创建了一个 ModelForm。

class Mant(forms.Modelform):
    start_date=forms.CharField()
    stop_date=forms.CharField()

    def clean_start_date(self):
        tz=self.request.session.get('timezone','UTC')
        data=self.cleaned_data['start_date']
        try:        
            date_parsed=arrow.get(data,'YYYY-MM-DD HH:mm').replace(tzinfo=tz)

        except ParserError as e:
            raise forms.ValidationError("invalid format")


        return date_parsed.format('YYYY-MM-DD HH:mm:ssZZ')

    def clean_stop_date(self):
        tz=self.request.session.get('timezone','UTC')
        data=self.cleaned_data['stop_date']
        try:        
            date_parsed=arrow.get(data,'YYYY-MM-DD HH:mm').replace(tzinfo=tz)

        except ParserError as e:
            raise forms.ValidationError("invalid format")


        return date_parsed.format('YYYY-MM-DD HH:mm:ssZZ')

表格效果很好。验证当前日期和所有。但我的问题是,当解析日期(或我添加的任何其他引发错误的东西)出现问题时,该字段为空,用户需要重新选择日期。

每次我在 django 中看到正常的验证错误时,用户填写的字段都会返回,以便用户进行更正。但在我的情况下,当 clean_field 被替换时,用户填写的值消失了。 有办法解决这个问题吗?

看起来如果第一个元素引发异常,验证将完全停止,并且所有其他错误都不会返回并且它们的字段被清空:(

【问题讨论】:

  • 将错误字符串添加到 ValidationError 消息中,或者更好的是,重新引发错误以查看调试时数据出了什么问题。
  • 加薪效果很好。我的问题是该字段为空(并且 clean_ 接下来的每个字段也为空。如果字段为空,就像 raise 停止所有清理一样。但只有带有 clean_ 方法的字段.
  • 请粘贴完整的提升消息,如果它工作正常。
  • 我没有收到任何错误消息。我得到的只是 ParserError 的另一个 raise as e: 现在我像这样连接它 forms.ValidationError(["invalid format ",e]) 其中 e 是错误的表示。
  • 我相信我不太了解您的请愿书。反正。我添加了一个“清除”方法,并在其中添加了 self.add_error('fecha_inicio', "Error") 并且无论在任何自定义 clean_ 中的输入,我添加的返回始终为空。

标签: python django forms validation


【解决方案1】:

很抱歉回答我自己的问题。

我的问题是在模板级别。

我的模板正在寻找一个硅藻土对象,因为需要在用户的时区中本地化日期。但是当表格出现错误时。该值不包含日期时间对象。只是一个带有先前输入的缓冲区。所以时区日期标签无法解析数据。打印一个空值。

现在表单中的部分看起来像这样。

<input class="form-control datetimepicker" data-date-format="YYYY-MM-DD HH:mm" id="id_start_date" name="start_date" type="text" 
                {%if form.errors %}
                value="{{field.value}}"
                {%else%}
                value="{{field.value|timezone:user_timezone|date:"Y-m-d H:i"}}" 

                {% endif %}

当表单带有错误数组时,我意识到了这一点并打印了值

【讨论】:

    猜你喜欢
    • 2021-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-10
    • 1970-01-01
    • 2020-01-08
    • 1970-01-01
    相关资源
    最近更新 更多