2010-09-01 14 views
14

Tôi muốn trên toàn cầu (thông qua toàn bộ trang web, quản trị và giao diện người dùng) điều chỉnh cách ngày và giờ được hiển thị theo ý thích của tôi, nhưng tôi không thể biết được điều gì đang diễn ra với các biến DATE_FORMAT, DATETIME_FORMAT và TIME_FORMAT .py.Django: Sử dụng DATE_FORMAT, DATETIME_FORMAT, TIME_FORMAT trong settings.py?

Trong this question nó nói rằng các cài đặt bị bỏ qua. Câu hỏi là hơn một năm tuổi mặc dù. Trong tài liệu Django nó nói rằng chúng có thể được sử dụng khi bạn có USE_L10N = True và rõ ràng là something changed trong Django 1.2. Theo số this tuy nhiên có thể có lỗi.

Tôi hiện đang sử dụng Django 1.2 và khi tôi có USE_L10N = True, nó chỉ bỏ qua định dạng ngày (giờ) trong settings.py. Khi tôi có USE_L10N = False nó cũng có vẻ bỏ qua chúng.

Có cách nào để tùy chỉnh hiển thị ngày và giờ trên toàn cầu không? Hoặc tôi có nên tạo tệp định dạng tùy chỉnh của riêng mình như Karen đề xuất trong bài đăng Nhóm người dùng Django Google không?

Trả lời

6

Có cùng vấn đề, giải pháp là simple and documented. Bất cứ khi nào bạn hiển thị ngày, bạn cần phải chỉ định bạn muốn mẫu hiển thị dưới dạng ngày/giờ/short_date/datetime (ví dụ: {{ some_date_var | date }} và sau đó nó sẽ hiển thị như được chỉ định với DATE_FORMAT trong settings.py của bạn

Ví dụ :

>>> from django.conf import settings # imported to show my variables in settings.py 
>>> settings.DATE_FORMAT # - showing my values; I modified this value 
'm/d/Y' 
>>> settings.TIME_FORMAT 
'P' 
>>> settings.DATETIME_FORMAT 
'N j, Y, P' 
>>> from django.template import Template, Context 
>>> from datetime import datetime 
>>> c = Context(dict(moon = datetime(1969, 7, 20, 20, 17, 39))) # Create context with datetime to render in a template 
>>> print c['moon'] # This is the default format of a printing datetime object 
1969-07-20 20:17:39 
>>> print Template("default formatting : {{ moon }}\n" 
        "use DATE_FORMAT : {{ moon|date }}\n" 
        "use TIME_FORMAT : {{ moon|time }}\n" 
        "use DATETIME_FORMAT: {{ moon|date:'DATETIME_FORMAT' }}\n" 
        "use SHORT_DATETIME_FORMAT: {{ moon|date:'SHORT_DATETIME_FORMAT' }}" 
        ).render(c) 
default formatting : 1969-07-20 20:17:39 
use DATE_FORMAT : 07/20/1969 
use TIME_FORMAT : 8:17 p.m. 
use DATETIME_FORMAT: July 20, 1969, 8:17 p.m. 
use SHORT_DATETIME_FORMAT: 07/20/1969 8:17 p.m. 

này có ý nghĩa; ví dụ, mẫu cần phải biết liệu nó nên sử dụng DATE_FORMAT hoặc SHORT_DATE_FORMAT hay bất cứ điều gì

7

Tìm kiếm thông qua nguồn cho thấy rằng DATETIME_FORMAT, v.v. chỉ được sử dụng khi gọi django.utils.formats.localize() và dường như chỉ được gọi khi django.template.VariableNode s được hiển thị.

Tôi không chắc chắn khi nào chính xác VariableNode s được sử dụng trong hiển thị mẫu, nhưng tôi đoán rằng nếu bạn đã bật settings.USE_L10N và bạn có một số VariableNode, nó sẽ được bản địa hóa.

localize trông như thế này:

def localize(value): 
    """ 
    Checks if value is a localizable type (date, number...) and returns it 
    formatted as a string using current locale format 
    """ 
    if settings.USE_L10N: 
     if isinstance(value, (decimal.Decimal, float, int)): 
      return number_format(value) 
     elif isinstance(value, datetime.datetime): 
      return date_format(value, 'DATETIME_FORMAT') 
     elif isinstance(value, datetime.date): 
      return date_format(value) 
     elif isinstance(value, datetime.time): 
      return time_format(value, 'TIME_FORMAT') 
    return value 

Để trả lời câu hỏi của bạn, tôi có thể viết một bộ xử lý bối cảnh nhanh chóng mà gọi localize() trên tất cả mọi thứ trong bối cảnh.

1

Bạn có thể ghi đè lên DATE_FORMAT, DATETIME_FORMAT, TIME_FORMAT và khác. định dạng ngày/giờ khi USE_L10N = True bởi creating custom format files as described in Django documentation.

Nói tóm lại:

  1. Đặt FORMAT_MODULE_PATH = 'yourproject.formats' trong settings.py
  2. Tạo cấu trúc thư mục yourproject/formats/en (thay thế en với tương ứng mã miền địa phương theo tiêu chuẩn ISO 639-1 nếu bạn đang sử dụng ngôn ngữ không phải tiếng Anh) và thêm __init__.py file tất cả các thư mục để biến nó thành một mô-đun Python hợp lệ
  3. Thêm formats.py vào thư mục lá, chứa các định nghĩa định dạng bạn muốn ghi đè, ví dụ DATE_FORMAT = 'j. F Y'.

Ví dụ từ dự án thực tế here.

1

Trả lời muộn nhưng hy vọng điều này sẽ giúp bất kỳ ai khác tìm kiếm điều này. Bằng cách đặt USE_L10N = Đúng trong cài đặt của bạn, Django tìm kiếm các định dạng cụ thể của miền địa phương, ưu tiên cho chúng hơn các cài đặt không liên quan đến miền địa phương.

Giải pháp: (để hiển thị 30/12/2017 trên DateField)

from django.conf.locale.en import formats as en_formats 

en_formats.DATE_FORMAT = "%d/%m/%Y" 

và cho đầu vào (để chấp nhận 30/12/2017 hoặc 30-12-2017)

en_formats.DATE_INPUT_FORMATS = ['%d/%m/%Y', '%d-%m-%Y'] 

tham khảo: https://mounirmesselmeni.github.io/2014/11/06/date-format-in-django-admin/

* thử nghiệm trên Django == 1.10.7

+0

Việc tạo các tệp định dạng tùy chỉnh có dễ dàng hơn như được mô tả trong https://docs.djangoproject.com/en/1.10/topics/i18n/formatting/#creating-custom-format-files không? – mrts

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