2009-05-25 22 views
6

Django có tùy chọn DATE_FORMAT và DATE_TIME_FORMAT cho phép chúng tôi chọn định dạng để sử dụng khi xem ngày, nhưng dường như không cho phép tôi thay đổi định dạng đầu vào cho ngày chỉnh sửa hoặc thêm vào Django Admin.Nhập ngày châu Âu tại Django Admin

Giá trị mặc định cho các admin là: YYYY-MM-DD

Nhưng sẽ là tuyệt vời để sử dụng: DD-MM-YYYY

Đây có phải là tích hợp trong bất kỳ trường hợp trong i18n? Điều này có thể thay đổi mà không có mô hình tùy chỉnh không?

Trả lời

2

Dựa trên ý tưởng này tôi đã thực hiện mới db.fields lớp EuDateField:

mydbfields.py

from django import forms 
from django.forms.fields import DEFAULT_DATE_INPUT_FORMATS 
from django.db import models 

class EuDateFormField(forms.DateField): 
    def __init__(self, *args, **kwargs): 
     kwargs.update({'input_formats': ("%d.%m.%Y",)+DEFAULT_DATE_INPUT_FORMATS}) 
     super(EuDateFormField, self).__init__(*args, **kwargs) 

class EuDateField(models.DateField): 
    def formfield(self, **kwargs): 
     kwargs.update({'form_class': EuDateFormField}) 
     return super(EuDateField, self).formfield(**kwargs) 

Lưu ý rằng nó bổ sung thêm định dạng của tôi (ví dụ 31.12.2007) sang các định dạng django hiện "chuẩn" ở vị trí đầu tiên.

Cách sử dụng:

from mydbfields import EuDateField 
class Person(models.Model): 
    ... 
    birthday = EuDateField("Birthday", null=True, blank=True, help_text="") 

Trong trường hợp của tôi này làm cho tốt trong admin, nhưng có lẽ hầu hết sẽ ở ModelForm quá (đã không thử nó).

phiên bản django của tôi là:

>>> import django 
>>> django.get_version() 
u'1.1 alpha 1 SVN-10105' 
+0

Ok, giải pháp này là tốt đẹp, nhưng làm thế nào tôi có thể sử dụng nó với AdminDateWidget? Widget này là một phần của MultiWidget của tôi. – alekwisnia

1

Có vẻ như đây là not yet supported, như tôi đã hiểu, vì vậy có, bạn sẽ phải thực hiện một số công việc tùy chỉnh ngay bây giờ.

2

Bạn phải tự làm điều này ngay bây giờ, nhưng thật dễ dàng để thực hiện với lớp trường biểu mẫu tùy chỉnh đặt đối số input_formats của DateField. Điều này nên làm điều đó:

class MyDateField(forms.DateField): 
    def __init__(self, *args, **kwargs): 
    kwargs.setdefault('input_formats', ("%d-%m-%Y",)) 
    super(MyDateField, self).__init__(*args, **kwargs) 

Lưu ý rằng input_formats là danh sách, vì vậy bạn có thể chỉ định nhiều khả năng và nó sẽ thử chúng khi phân tích cú pháp đầu vào của người dùng.

+0

Tôi có thể áp dụng điều này trên các biểu mẫu mới của mình, nhưng, làm cách nào tôi có thể ghi đè trường biểu mẫu mặc định trong trang quản trị? – Andor

2

Tôi đã sửa đổi các thiết lập để nó vô hiệu hóa l10n và thiết lập định dạng ngày explicite:

USE_L10N = False 
DATE_FORMAT = 'd-m-Y' 
DATETIME_FORMAT = 'd-m-Y H:i' 

Bạn có thể đặt DATE_INPUT_FORMATS là tốt.

9

Có một cách chính thức để thực hiện việc này ngay bây giờ kể từ khi đóng Django ticket 6483 & bản phát hành của Django 1.2.

Nếu bạn có USE_L10N được đặt thành False, những gì bạn cần làm là chỉ định DATE_INPUT_FORMATSDATETIME_INPUT_FORMATS trong số settings.py của mình. Dưới đây là các thiết lập tôi sử dụng cho điều này, dựa trên chuyển đổi giá trị mặc định:

#dd/mm/yyyy and dd/mm/yy date & datetime input field settings 
DATE_INPUT_FORMATS = ('%d-%m-%Y', '%d/%m/%Y', '%d/%m/%y', '%d %b %Y', 
         '%d %b, %Y', '%d %b %Y', '%d %b, %Y', '%d %B, %Y', 
         '%d %B %Y') 
DATETIME_INPUT_FORMATS = ('%d/%m/%Y %H:%M:%S', '%d/%m/%Y %H:%M', '%d/%m/%Y', 
          '%d/%m/%y %H:%M:%S', '%d/%m/%y %H:%M', '%d/%m/%y', 
          '%Y-%m-%d %H:%M:%S', '%Y-%m-%d %H:%M', '%Y-%m-%d') 

Nếu bạn có USE_L10N thiết lập để True, sau đó bạn sẽ cần phải sử dụng FORMAT_MODULE_PATH để thay thế.

Ví dụ, tôi LANGUAGE_CODE được thiết lập để en-au, trang web của tôi được gọi là golf, và FORMAT_MODULE_PATH của tôi được thiết lập để golf.formats, vì vậy cấu trúc thư mục của tôi trông như thế này:

golf/ 
    settings.py 
    ... 
    formats/ 
     __init__.py 
     en/ 
      __init__.py 
      formats.py 

và các thiết lập DATE_INPUT_FORMATSDATETIME_INPUT_FORMATS là trong formats.py thay vì settings.py.

+1

Đã làm việc cho tôi. Cảm ơn! –

0

chỉ cần cẩn thận để không viết nó dưới dạng chuỗi nhưng là một bộ tuple. ví dụ:

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

nếu bạn muốn chỉ có một cách hợp lệ để ghi ngày tháng vào biểu mẫu.

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