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

问题描述:

出于某种原因,我的表单中不接受美式日期格式。我想知道是否有任何来自美国的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更改为欧洲,反映了我的位置。聪明。

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

这看起来不对。当然,我可以使用format='%m/%d/%Y'来覆盖它,但不是那种硬编码和不好的做法?当然,这些表格必须依赖于当前文化的日期格式,即美国,但为什么不会发生?

+0

你的数据库的默认日期格式是'YYYY-MM-DD'的定位是在表单字段_Input不validation_展出。在模板或输出中使用时(如在预填表格的字段时),您需要确保按照用户当前所选语言环境进行本地化。 – 2012-08-15 20:50:24

尝试以下操作:

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 
+0

它抛出一个异常:'__init __()得到了一个意想不到的关键字参数'input_formats'' – Houman 2012-08-12 21:35:36

+1

我更新了代码。 – solartic 2012-08-12 21:36:48

+1

现在可以使用。谢谢。但是,在硬编码输入格式时,这不违反应用程序的本地化吗? Django框架中的日期格式不应该根据选定的语言/文化来选择吗? – Houman 2012-08-12 21:51:30

固定! Hi Kave,在经过一段时间的调查后,终于找到了解决办法。

  • 首先,您应该使用activate(language_code)来切换到新的语言。
  • 必须设置本地化两个:场和widget:

样品切换语言:使用

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)'的帖子。

好吧,现在来解决这个问题。为了达到这个目标,一直是一个伟大的团队工作。 :)

由于下面提到的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

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

我希望这有助于有人出来......