簡體   English   中英

Django ModelForm無法使用自定義日期格式正確驗證

[英]Django ModelForm not validating correctly with custom date format

我正在使用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'

但這也不起作用。 也許出於完全不同的原因,但我擺脫了它。 從現在開始,我仍將參考第一個示例。

我已經檢查了在提交表單時使用Chrome的開發者控制台發送的POST數據,並使用所需的格式發送了該數據。 而當預先填充時,已經存在的值也是正確的。 因此,我認為問題不在於客戶,也不在於表單的呈現方式。
似乎有些奇怪的是,如果我以默認格式鍵入日期,它確實可以驗證。 但它仍以自定義格式呈現。

此外,我已經在禁用L10N和I18N的情況下進行了嘗試。 我從這個問題的第二個答案中得到了這個主意。 不幸的是(但也很幸運),它沒有用。

萬一有人需要它,這里是模板之一:

{% 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。 現在都不存在。

作為對以上評論的回應,第一種方法不起作用的原因是DateInput上的format參數僅控制將顯示該字段的初始值的格式 (來自docs )。

它不控制如何解析提交的數據-即, DateField仍將嘗試使用其默認格式來解析提交的數據。 要進行更改,您需要在DateFielddocs )上使用input_formats參數。

因此,實際上,您需要像在第二次嘗試中一樣設置兩者。 唯一的問題是您的格式中有一個逗號。

如果您在整個項目中使用一致的日期格式,則只需使用DATE_INPUT_FORMATS設置即可正確配置DateFieldDateInput以使用相同的格式。 這樣,您不必單獨指定它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM