2012-08-12 79 views
1

出於某種原因,我的表單中不接受美式日期格式。我想知道是否有任何來自美國的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

回答

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

0

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

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

解決此問題一直是一個偉大的團隊努力。 :)

我希望這有助於有人出來......