Django:如何在表单中获取美国日期格式?

时间:2012-08-12 21:03:15

标签: django

由于某种原因,我的表格中不接受美国日期格式。我想知道来自美国的任何Django开发人员是否可以帮助我。我怀疑设置中的时区也会影响日期格式,但我不确定。

设置:

TIME_ZONE = 'Europe/London'
LANGUAGE_CODE = 'en-us'
USE_I18N = True
USE_L10N = True
USE_TZ = True

的ModelForm:

class CallsForm(ModelForm):    
   class Meta:
        model = Conversation   
        widgets = {
                    'contact_date': forms.DateInput(attrs={'placeholder': 'Add the date...', 'id': 'datepicker', 'class': 'placeholder_fix_css'}, format='%m/%d/%Y'),
                   }

enter image description here

有什么想法吗?感谢

更新

我更接近发生的事情:

MIDDLEWARE_CLASSES = (
    ...
    'django.middleware.locale.LocaleMiddleware',
)

似乎只要加载LocaleMiddleware,Django就会从我的浏览器会话中获取设置,因此dateformat更改为欧洲反映了我的位置。聪明。

现在,在美国日期格式中接受了日期输入。 在模板中,我得到Aug. 31, 2012,这也是正确的。 但是在表单中,一旦我尝试修改记录,我得到2012-08-31 ??

这似乎不对。当然我可以使用format='%m/%d/%Y'来覆盖它,但这不是硬编码和不良做法吗?当然,形式必须依赖于当前文化的日期格式,即美国,但为什么不发生这种情况呢?

3 个答案:

答案 0 :(得分:0)

尝试以下方法:

class CallsForm(ModelForm):
   contact_date = DateField(widget=forms.DateInput(attrs={'placeholder': 'Add the date...', 'id': 'datepicker', 'class': 'placeholder_fix_css'}, format='%m/%d/%Y'))    
   class Meta:
        model = Conversation

答案 1 :(得分:0)

固定!!嗨Kave,经过一段时间调查你的问题,最后我找到了解决方案。

  • 首先,您应该使用activate(language_code)切换到新语言。
  • 您必须将其设置为本地化:字段和窗口小部件:

示例切换语言:

def display_current_language(request):
    if request.LANGUAGE_CODE == 'en-gb':
        lang = "You prefer to read British English {code}.".format(
                  code=request.LANGUAGE_CODE )
        activate(request.LANGUAGE_CODE)
    elif request.LANGUAGE_CODE == 'en-us':
        lang = "You prefer to read American English {code}.".format(
                  code=request.LANGUAGE_CODE )
        activate('en-us')    
    else:
        lang = "You prefer to read Deutsch {code}.".format( 
                   code=request.LANGUAGE_CODE )
        activate(request.LANGUAGE_CODE)    
    return lang

使用您的模型(公司)和您的字段(日期)的示例:

class CompanyForm(ModelForm):        
    class Meta:
        model = Company 

    def __init__(self, *args, **kwargs):
        super(CompanyForm, self).__init__(*args, **kwargs)
        self.fields['date'].localize = True
        self.fields['date'].widget.is_localized = True

也发布在' Django: despite selected language, Forms still rely on LANGUAGE_CODE to format datetime (demo included)'交。

答案 2 :(得分:0)

好吧,现在要解决这个问题了。到目前为止,这是一项伟大的团队合作。 :)

如下面提到的solartic,表单中字段的localize参数必须设置为true。如果它是一个ModelForm,它将会更棘手,因为你需要一个回调:

class CompanyForm(ModelForm):
    def date_callback(self, field, **kwargs) :
        return field.date(localize=True, **kwargs)

    class Meta:
        model = Company  

但这还不够。如果不对任何日期输入格式进行硬编码,则需要覆盖formats.py。这有点复杂,请参阅Creating custom format files我已为此here创建了一个演示。

该演示仅在中途工作,因为切换语言仅适用于模板,但不适用于表单。为了解决这个问题,你需要danihp的解决方案。 :) 切换后,需要再次激活语言。如需完整修复,请参阅here

解决这个问题一直是一项伟大的团队努力。 :)

我希望这可以帮助那些人...