【问题标题】:Django ModelForm not validating correctly with custom date formatDjango ModelForm 无法使用自定义日期格式正确验证
【发布时间】:2015-10-08 16:50:30
【问题描述】:

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

这是我的表单类:

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 之前它还在工作。
我决定不使用它,并删除了我为它添加的所有内容。我找不到任何东西,它甚至不需要编辑视图或表单,只需为过滤器添加一个新文件,并添加一个指向应用程序附带的基于类的视图的 URL。现在都不存在了。

【问题讨论】:

  • 您的第二次尝试看起来是正确的,只是您的格式中有一个逗号 (%m,-%d-%Y)。如果您删除逗号,它应该可以工作。
  • 这行得通,谢谢。如果归根结底,我会以手动方式进行,但我仍然想知道为什么第一个不起作用。
  • 添加了一个解释原因的答案。

标签: python django django-forms


【解决方案1】:

针对your comment above,您的第一种方法不起作用的原因是DateInput 上的format 参数仅控制该字段初始值的显示格式。 (来自docs)。

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

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

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

【讨论】:

  • 这是有道理的。我想我只是认为 Django 会假设响应中发送的格式与它返回的格式相同。也许我之前添加了一些使它起作用的东西,然后就忘记了。无论如何,谢谢!
猜你喜欢
  • 2012-05-23
  • 2012-07-22
  • 2013-11-26
  • 1970-01-01
  • 2018-10-21
  • 1970-01-01
  • 1970-01-01
  • 2019-10-04
  • 2018-09-09
相关资源
最近更新 更多