2015-10-08 64 views
1

我正在使用Django的forms.ModelForm,但我不想使用 默認格式的日期字段(在我的區域設置,這是'%Y-%m-%d')。我不 記得爲什麼我想改變它,但在這一點上,我決心圖 出了什麼問題無論如何。
似乎這個問題已被多次詢問,但其中大多數與 略有不同,或者答案對我沒有幫助。Django ModelForm沒有正確驗證自定義日期格式

這是我的表單類:

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。我從 得到了第二個回答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。這兩者現在都不存在。

+0

除了以格式('%m, - %d-%Y')命名逗號之外,第二次嘗試看起來正確。它應該工作,如果你刪除逗號。 – solarissmoke

+0

工作,謝謝。如果涉及到它,我會用手動方式來做,但我仍然想知道_why_第一個不起作用。 – damienmh

+0

已添加解釋原因的答案。 – solarissmoke

回答

0

針對your comment above,你的第一個方法是行不通的原因是,在DateInputformat參數只控制在這一領域的初始值將顯示格式。 (來自docs)。

它不控制如何解析提交的數據 - 即,DateField仍將嘗試使用其默認格式解析提交的數據。要改變這種情況,您需要DateFielddocs)上的input_formats參數。

真的,你需要設置兩者,就像你在第二次嘗試時一樣。唯一的問題是你的格式有一個逗號逗號。

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

+0

這很有道理。我想我只是以爲Django會認爲在回覆中發送的格式與它回覆的格式相同。也許我有一些補充說,之前,它只是讓它工作,而忘記了它。不管怎樣,謝謝! – damienmh