문제

호주 형식 (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 메커니즘은 두 가지입니다.

  1. 그것은 읽기 어려우며 modelforms의 내부 작업에 대한 지식에 의존합니다. Formfield_callback에서 실제 문서를 찾을 수 없습니다 ...

  2. 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)
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top