2011-02-02 48 views
16

Có cách nào tôi có thể nhận django để lưu trữ dữ liệu của mình trong postgresql là 'dd-mm-yyyy' (nếu cần) và có biểu mẫu django xác thực cho 'dd-mm không -yyyy '?Định dạng ngày tháng django 'dd-mm-yyyy'

(Tôi đã cố gắng mà không có nhiều điều thành công như:

DATE_INPUT_FORMATS = ('%d-%m-%Y') 
USE_I18N = True 
USE_L10N = True 

Và thực hiện rất nhiều googling nhưng không thành công :(

Trả lời

27

Vấn đề bật ra được rằng tôi cần cả hai định dạng ngày theo tiêu chuẩn ISO và Anh trong file settings.py như vậy:

DATE_INPUT_FORMATS = ('%d-%m-%Y','%Y-%m-%d') 

và sau đó forms.py điều chỉnh như sau:

class ClientDetailsForm(ModelForm): 
    date_of_birth = DateField(input_formats=settings.DATE_INPUT_FORMATS) 
    class Meta: 
     model = ClientDetails 

Tại sao USE_L10N = True không thể làm điều này tôi không biết!

[Nhờ thisthis]

+1

Bạn không có định dạng của Hoa Kỳ như bạn đã nói, bạn có định dạng Anh và ISO. – dalore

+0

Bạn nói đúng. Tôi đã sửa chữa nó – Sevenearths

-2

Bạn có thể sử dụng một CharField nếu bạn muốn lưu trữ ở định dạng này chính xác, nếu không nó sẽ sử dụng định dạng python datetime.

Nếu bạn sử dụng CharField, bạn có thể viết biểu mẫu với tùy chỉnh v alidation cho lĩnh vực này.

+1

Nếu bạn chỉ muốn hiển thị định dạng trên trang qua mẫu, bạn có thể sử dụng bộ lọc mẫu "thời gian" Django: http://docs.djangoproject.com/en/1.2/ref/templates/builtins/#date – Hixi

0

Tôi sẽ ghi đè lên DateTimeField đặt logic của chúng tôi. Nó không quan trọng như thế nào postgresql được lưu trữ nó, bạn có thể định dạng nó bao giờ bạn muốn.

Documents: http://docs.djangoproject.com/en/dev/ref/models/instances/

+0

vì vậy django sẽ không làm điều này cho tôi? Tôi phải tự làm sao? – Sevenearths

+0

điều này có thể giúp: http://docs.djangoproject.com/en/1.1/ref/forms/fields/#datefield để giữ cho nó đơn giản – programmersbook

18

DATE_INPUT_FORMATS trong settings.py không có tác dụng với USE_I18N = True. Điều này là do django sẽ tải định dạng cụ thể cho miền địa phương đang hoạt động. Tàu Django có định nghĩa định dạng cho nhiều miền địa phương khác nhau.

Bạn có thể ghi đè lên django định nghĩa định dạng mặc định:

mysite/ 
    formats/ 
     __init__.py 
     en/ 
      __init__.py 
      formats.py 

Như đã trình bày trong tài liệu django: Creating custom formats file

+0

không 'USE_L10N = True' có bất kỳ ảnh hưởng nào trên' DATE_INPUT_FORMATS' – Sevenearths

+1

Nếu 'USE_L10N = Sai' sau đó django sẽ không sử dụng bất kỳ định dạng nào từ cài đặt của bạn. 'USE_L10N = True' cho phép bạn đặt các định dạng trong settings.py của mình. Và 'USE_I18N = True' đi xa hơn và cho phép định dạng địa phương cụ thể. – Ski

8

Trong Sevenearths answer có những nhận xét

Tại sao USE_L10N = True không thể chỉ làm điều này tôi không biết!

Các tài liệu nói rằng USE_L10N = True là cài đặt mặc định, nhưng để có được UK vị để làm việc LANGUAGE_CODE cũng phải được thay đổi từ thiết lập mặc định của nó en-us-en-GB. Sau khi thay đổi, các trường ngày tháng sẽ tự động chấp nhận các định dạng "dd/mm/yyyy" và "yyyy-mm-dd" (và có thể là những người khác, tôi chưa thử nghiệm tất cả) mà không cần đặt input_formats = settings.DATE_INPUT_FORMATS trong mọi ngày biểu mẫu cánh đồng.

2

Đây có thể không phải là câu trả lời cho câu hỏi chính xác, nhưng kể từ khi tôi đến đây ...Tôi sẽ đề nghị sử dụng một widget ngày, và để cho Django lưu ngày theo cách nó hiểu nó. Xác định trường trong biểu mẫu của bạn như vậy:

import datetime 
from django import forms 

def last_years(): 
    first_year = datetime.datetime.now().year - 6 
    return list(range(first_year + 7, first_year, -1)) 

class MyForm(forms.Form): 
    # This is it... it's user friendly, and can't go wrong parsing it 
    date = forms.DateField(widget=forms.SelectDateWidget(years = last_years())) 

Nếu bạn nhập trường vào trường ngày của Mô hình Django, thì vấn đề duy nhất còn lại sẽ là định dạng biểu diễn đầu ra. Tôi có đúng không?

+0

Rất nhiều thay đổi kể từ khi tôi hỏi câu hỏi này. Tôi nghĩ câu trả lời của bạn sẽ hoàn hảo cho 1.10+ – Sevenearths

+0

: D thực sự ... Tôi chỉ cần chạm vào câu hỏi này và nghĩ rằng tôi sẽ ném một số gợi ý cập nhật (6 năm sau) – coya

Các vấn đề liên quan