Django ModelForm 无法使用自定义日期格式正确验证

Django ModelForm not validating correctly with custom date format

我正在使用 Django 的 forms.ModelForm 制作表单,但我不想使用 日期字段的默认格式(在我的语言环境中,即 '%Y-%m-%d')。我不 记得为什么我想改变它,但在这一点上我下定决心要弄清楚 找出问题所在。
好像这个问题已经被问过很多次了,但大多数都是 略有不同,或者答案对我没有帮助。

这是我的表格class:

class RejectionForm(forms.ModelForm):
    class Meta:
        model = Rejection
        fields = ['date',
                  'plant',
                  'part',
                  'defects',
                  'shift',
                  'station',
                  'worker',
                  'quantity',
                  'location',
                  'rejected_by',
                  'remark']
        widgets = {
            'date': forms.DateInput(attrs={'class': 'date'}, format='%m-%d-%Y')
        }

    error_css_class = 'danger'

我也试过这样的:

class RejectionForm(forms.ModelForm):
    date = forms.DateField(
        input_formats=['%m,-%d-%Y'],
        widget=forms.DateInput(
            attrs={'class': 'date'},
            format='%m-%d-%Y'
        )
    )

    class Meta:
        model = Rejection
        fields = ['date',
                  'plant',
                  'part',
                  'defects',
                  'shift',
                  'station',
                  'worker',
                  'quantity',
                  'location',
                  'rejected_by',
                  'remark']

    error_css_class = 'danger'

但这也没有用。也许出于完全不同的原因,但我得到了 摆脱它。从现在开始,我仍然指的是第一个例子。

我已经检查了提交表单时发送的 POST 数据,使用 Chrome 的 开发人员控制台,它使用我想要的格式发送它。什么时候 预先填充,已经存在的值也是正确的。所以我不认为 问题与客户端或表单呈现方式有关。
看起来有点奇怪的是,如果我输入日期,它 验证 以默认格式。但它仍然以自定义格式呈现它。

此外,我已经在禁用 L10N 和 I18N 的情况下进行了尝试。我的想法来自 this 的第二个答案 题。不幸的是(但也有点幸运),它没有用。

为了以防万一有人需要它,这里有一个模板:

{% extends 'defective/base.html' %}

{% block content %}
<form action="{% url 'defective:edit-id' rej_id=rej_id %}" method="POST" id="rejection_form" class="form-group create-form">
    {% csrf_token %}

    <table class="table table-hover">
        {{ form.as_table }}
    </table>

    <input type="submit" value="Save and view" class="btn btn-primary"><br>
</form>

<script>
    $('.date').datepicker({dateFormat: 'mm-dd-yy'});
</script>
{% endblock %}

以及相应视图的相关部分:

instance = get_object_or_404(Rejection, pk=rej_id)
form = RejectionForm(request.POST, instance=instance)
if form.is_valid():
    form.save()
    return HttpResponseRedirect(reverse('defective:view-id', kwargs={'rej_id': rej_id}))
else:
    context = {'title': 'Edit an entry',
               'rej_id': rej_id,
               'form': form}
    return render(request, 'defective/edit.html', context)

我不确定到底需要什么,所以请随时询问您是否还想看其他内容。

编辑:可能值得注意的是它在过去确实有效。我不确定它什么时候停止的,但我记得在我开始玩 django-filter.
之前它还在工作 我决定不使用它,并删除了我为它添加的所有内容。我找不到剩下的任何东西,它甚至没有要求编辑视图或表单,只是为过滤器添加了一个新文件,并添加了一个指向基于 class 的 URL该应用程序附带的视图。现在两者都不存在。

回应, the reason your first approach doesn't work is that the format argument on the DateInput only controls the format in which this field’s initial value will be displayed. (from the docs).

它不控制提交数据的解析方式 - 即,DateField 仍将尝试使用其默认格式解析提交的数据。要更改它,您需要 DateField (docs) 上的 input_formats 参数。

真的,您需要像在第二次尝试中那样设置两者。唯一的问题是您的格式中有一个逗号。

如果您在整个项目中使用一致的日期格式,那么您只需使用 DATE_INPUT_FORMATS 设置即可正确配置 DateFieldDateInput 以使用相同的格式。这样您就不必单独指定它。