2017-08-06 90 views
2

提交django表單時出現ValidationError錯誤。使用自定義日期格式提交表單時出現ValidationError

以我的形式,這是我的輸入:01/01/2017 但Django告訴我,格式必須是'AAAA-MM-GG'。
與此異常地點:/usr/local/lib/python3.5/dist-packages/django/db/models/fields/ 初始化的.py在to_python,線路1271

這是對我的代碼項目:

# models.py 
class Archivio(models.Model): 
    sys_codice = models.AutoField(primary_key=True) 
    some_other_field ... 

class QuoteIscrizione(models.Model): 
    sys_chiave = models.AutoField(primary_key=True) 
    sys_cod = models.ForeignKey(Archivio, on_delete=models.CASCADE) 
    data_quota = models.DateField(blank=True, null=True) 


# forms.py 
class ArchivioSearchForm(forms.Form): 
    data_quota = forms.DateField(widget=forms.DateInput(format='%d/%m/%Y'), input_formats=('%d/%m/%Y',), required=False) 

    def __init__(self, *args, **kwargs): 
     super().__init__(*args, **kwargs) 
     for field in self: 
      field.field.widget.attrs['class'] = 'form-control ' 
       if type(field.field.widget) is DateInput: 
        field.field.widget.attrs['class'] += 'datepicker' 
    def clean(self): 
     data_quota = self.cleaned_data['data_quota'] 
     return self.cleaned_data 

# views.py 
def ArchivioSearchView(request): 
    model = Archivio 
    form = ArchivioSearchForm() 

    if request.GET.get('data_quota'): 
     selection = Archivio.objects.filter(Q(quoteiscrizione__data_quota__gte=request.GET.get('data_quota')) 
     return render(request, 'search_template.html', {'selection':selection, 'form':form}) 

# search_template.html 
<form action="" method="get" class="form-horizontal"> 
    <div class="form-group form-group-md">    
    <input type="hidden" name="csrfmiddlewaretoken" value="{{ csrf_token }}"> 
     {% for field in form %} 
      <div class="form-group row"> 
       <label class="col-md-3 col-form-label" for="{{ field.id_for_label }}">{{ field.label }}</label> 
       <div class="col-md-6"> 
        {{ field.as_widget() }} 
       </div> 
      </div> 
     {% endfor %} 
    <input type="submit" value="Confermo" /> 
    </div> 
</form> 
{% for select in selection %} 
    <h4><li><a href="{{ url('archivio_detail', args=[select.pk]) }}">{{ select.nominativo }}</a></li></h4> 
{% endfor %} 

而且我也有這個在我的settings.py

LANGUAGE_CODE = 'it-IT' 
TIME_ZONE = 'Europe/Rome' 
USE_I18N = True 
USE_L10N = True 
USE_TZ = True 

我試圖打開USE_L10N後我當然settings.py使用=假 DATE_INPUT_FORMATS = [ '%d /%米/%Y']

我試圖也對INIT在我forms.py使用功能上循環:

if type(field.field.widget) is DateInput: 
    field.field.widget.input_formats = ['d%/%m/%Y'] 

我試圖不僅與詞典還可以使用類似'%d /%m /%Y'的字符串。

我也看到,即使我的輸入是2017/01/01,也會發生此錯誤!

我搞不​​清楚我做錯了什麼。即使我重寫DateField的每個可能的方法或參數,Django仍會繼續使用'YYYY-MM-DD'格式的日期。

感謝大家,這需要您一些時間來幫助我!

+0

嗨,這是一個有趣的問題,但你可能要更改標題的東西比如「以自定義日期格式提交表單時出現ValidationError」,以幫助人們在僅查看標題時找到並理解您的問題。 –

+0

感謝您的建議,我會馬上做到! –

回答

0

你需要在聲明的變量的形式,加上input_formats,喜歡設置DateInput插件格式:

data_quota = forms.DateField(widget=forms.DateInput(format ='%d/%m/%Y'), input_formats=('%d/%m/%Y',), required=False) 
+0

我把這個添加到了我的表單的字段中,但是我得到的格式必須是'YYYY-MM-DD'相同的ValidationError!,你有什麼想法是什麼? –

+0

我用你的建議更新了代碼 –

+0

我不知道爲什麼,但是如果我在我的ArchivioSearchView()函數上導入datetime並使datetime.datetime.strptime(request.GET.get('data_quota'),「%d /%m /%Y「)它正常工作,我沒有得到任何其他錯誤 –