django 양식 만들기 .datefield 쇼 지역 날짜 형식을 사용합니다
문제
호주 형식 (DD/MM/YYYY)으로 날짜를 보여주는 양식을 쉽게 구축하는 방법을 찾으려고 노력하고 있습니다. 이것이 내가 할 수있는 유일한 방법이었습니다. 더 나은 솔루션이 있어야하는 것 같습니다.
주목할만한 것 :
- DD/MM/YYYY 형식의 날짜 값을 렌더링하는 새 위젯을 만들었습니다.
- 생성 날짜 형식 문자열을 사용하려는 값 목록에 새 날짜 필드를 만들었습니다.
이상적인 솔루션은 자동으로 현지화되었지만 나에게는 효과가 없었던 날짜장 일 것이라고 생각합니다 (스트프 프리 타임은 유니 코드 친화적 인 것처럼 보이지 않았지만 열심히 노력하지는 않았습니다).
내가 뭔가를 놓치고 있습니까? 더 우아한 솔루션이 있습니까? 이것이 강력한 접근 방식입니까?
from models import *
from django import forms
import datetime
class MyDateWidget(forms.TextInput):
def render(self, name, value, attrs=None):
if isinstance(value, datetime.date):
value=value.strftime("%d/%m/%Y")
return super(MyDateWidget, self).render(name, value, attrs)
class MyDateField(forms.DateField):
widget = MyDateWidget
def __init__(self, *args, **kwargs):
super(MyDateField, self).__init__(*args, **kwargs)
self.input_formats = ("%d/%m/%Y",)+(self.input_formats)
class ExampleForm(ModelForm):
class Meta:
model=MyModel
fields=('name', 'date_of_birth')
date_of_birth = MyDateField()
해결책
물론, 나는 Django/Python Jedi가 아니지만 ...
나는 당신의 접근 방식에 문제가 있다고 생각하지 않습니다. 깨끗한 읽기입니다.
첫 번째 양식 디스플레이에서 날짜를 올바른 형식으로 렌더링하기 위해 자신만의 위젯을 만들 필요가 없습니다. 그냥 사용하십시오 format
에 대한 매개 변수 DateInput
위젯과 당신은 괜찮을 것입니다. 그래서 당신의 mydatefield 수업에서 나는 그냥 할 것입니다 :
class MyDateField(forms.DateField):
widget = forms.DateInput(format="%d/%m/%Y")
def __init__(self, *args, **kwargs):
super(MyDateField, self).__init__(*args, **kwargs)
self.input_formats = ("%d/%m/%Y",)+(self.input_formats)
당신은 사용할 수 있습니다 formfield_callback
(참조 받아 들여진 답변 이 먼 관련 질문)), 의미 :
def customize_fields(f):
if isinstance(f, DateTimeField):
datetime_field=forms.DateTimeField(widget=
forms.DateInput(format='%d/%m/%Y %h:%i'))
date_field.input_formats = ("%d/%m/%Y %h:%i",)+
(date_field.input_formats)
return datetime_field
elif isinstance(f, DateField):
date_field=forms.DateField(widget=
forms.DateInput(format='%d/%m/%Y'))
date_field.input_formats = ("%d/%m/%Y",)+
(date_field.input_formats)
return date_field
else:
return f.formfield()
class MyModelForm(forms.ModelForm):
formfield_callback = customize_fields
class Meta:
model = ...
그렇게하는 것은 당신의 필요를 완전히 제거합니다 MyDateField
수업이지만 소개 할 수 있습니다 - 모든 단일 폼 클래스가 전화를 원한다면 customize_fields
- Modelform 후손이 필요합니다 formfield_callback=customize_fields
모든 양식 클래스의 새로운 기반으로.
사용하는 데 문제가 있습니다 formfield_callback
메커니즘은 두 가지입니다.
그것은 읽기 어려우며 modelforms의 내부 작업에 대한 지식에 의존합니다. Formfield_callback에서 실제 문서를 찾을 수 없습니다 ...
Modelform에서 모델 필드를 재정의 해야하는 경우, 다음과 같은 양식의 특정 인스턴스에 필드를 필요로하지 않도록하십시오.
class MyModelForm(forms.ModelForm): formfield_callback = customize_fields foo = forms.DateField(required=false) class Meta: model = Bar
Customize_fields가 반환 한 양식 필드를 덮어 쓰고 있으므로 사용자 정의를 완전히 잃어 버립니다.
나는 당신의 접근 방식이 더 읽기에 가능하다고 생각합니다.
다른 팁
이전 에이 간단한 접근 방식을 사용했습니다. Datefield.widget의 '형식'속성을 양식의 시작으로 설정했습니다.
class ExampleForm(ModelForm):
class Meta:
model = MyModel
def __init__(self, *args, **kwargs):
super(ModelForm, self).__init__(*args, **kwargs)
self.fields['date_of_birth'].widget.format = '%d/%m/%Y'
# at the same time, set the input format on the date field like you want it:
self.fields['date_of_birth'].input_formats = ['%d/%m/%Y']
모든 사용자 정의 위젯 물건을 우회 할 수 있습니다.
여기에서 발췌 한 내용이 있습니다 django/forms/widgets.py
:
class DateInput(TextInput):
def __init__(self, attrs=None, format=None):
super(DateInput, self).__init__(attrs)
if format:
self.format = format
self.manual_format = True
else:
self.format = formats.get_format('DATE_INPUT_FORMATS')[0]
self.manual_format = False
위젯 형식은 형식 모듈을 사용하여 설정되어 있음을 알 수 있습니다. 형식 모듈은 로케일에 따라 선택됩니다. 미국에서 탐색하는 경우 Django는 기본적으로 선택합니다. django.conf.formats.locale.en.formats.py
. 여기에는 기본 형식이 있습니다.
DATE_INPUT_FORMATS = (
'%Y-%m-%d', '%m/%d/%Y', '%m/%d/%y', # '2006-10-25', '10/25/2006', '10/25/06'
# '%b %d %Y', '%b %d, %Y', # 'Oct 25 2006', 'Oct 25, 2006'
# '%d %b %Y', '%d %b, %Y', # '25 Oct 2006', '25 Oct, 2006'
# '%B %d %Y', '%B %d, %Y', # 'October 25 2006', 'October 25, 2006'
# '%d %B %Y', '%d %B, %Y', # '25 October 2006', '25 October, 2006'
)
첫 번째 코드 블록에서 볼 수 있듯이 Django는이 중 첫 번째를 선택합니다. 형식 변경에 대한 철저한 접근 방식은 문제의 로케일에 대한 Django의 기본값을 우선시하여 고유 한 형식 모듈을 작성하는 것입니다. 이를 위해 살펴보십시오 format_module_path. 당신이하려는 모든 것이 기본 날짜 형식을 무시하는 것만이라면 시간과 원숭이 패치를 스스로 저장한다고 말합니다. 이것을 내 설정 파일에 추가했으며 모든 것이 선호하는 기본 형식으로 훌륭하게 작동하는 것으로 보입니다.
DATE_INPUT_FORMATS = ('%m/%d/%Y', '%m/%d/%y', '%Y-%m-%d',
'%b %d %Y', '%b %d, %Y', '%d %b %Y',
'%d %b, %Y', '%B %d %Y', '%B %d, %Y',
'%d %B %Y', '%d %B, %Y')
from django.conf.locale.en import formats
formats.DATE_INPUT_FORMATS = DATE_INPUT_FORMATS
내 형태로 나는 다음을 사용하고있다.
def today():
from datetime import date
return date.today().strftime("%d.%m.%Y")
when = models.DateField(u'Когда', default=today)