2009-05-25 11 views
6

Django में एक DATE_FORMAT और एक DATE_TIME_FORMAT विकल्प हैं जो हमें तारीखों को देखने के दौरान उपयोग करने के लिए कौन सा प्रारूप चुनने की अनुमति देता है, लेकिन जाहिर है कि मुझे संपादन या जोड़ने में दिनांक के लिए इनपुट प्रारूप बदलने की अनुमति नहीं है Django व्यवस्थापक।Django व्यवस्थापक में यूरोपीय दिनांक इनपुट

व्यवस्थापक के लिए डिफ़ॉल्ट है: YYYY-MM-DD

लेकिन उपयोग करने के लिए भयानक होगा: DD-MM-YYYY

इस i18n में किसी भी मामले में एकीकृत है? क्या इसे कस्टम मॉडल के बिना बदला जा सकता है?

उत्तर

2

इस विचार के आधार पर मैं नए db.fields वर्ग EuDateField बनाया:

mydbfields.py

from django import forms 
from django.forms.fields import DEFAULT_DATE_INPUT_FORMATS 
from django.db import models 

class EuDateFormField(forms.DateField): 
    def __init__(self, *args, **kwargs): 
     kwargs.update({'input_formats': ("%d.%m.%Y",)+DEFAULT_DATE_INPUT_FORMATS}) 
     super(EuDateFormField, self).__init__(*args, **kwargs) 

class EuDateField(models.DateField): 
    def formfield(self, **kwargs): 
     kwargs.update({'form_class': EuDateFormField}) 
     return super(EuDateField, self).formfield(**kwargs) 

ध्यान दें कि यह मौजूदा "मानक" Django प्रारूपों के लिए अपने स्वरूप (31.12.2007 जैसे) कहते हैं पहली जगह पर

उपयोग:

from mydbfields import EuDateField 
class Person(models.Model): 
    ... 
    birthday = EuDateField("Birthday", null=True, blank=True, help_text="") 

मेरे मामले में यह व्यवस्थापक में अच्छा renders, लेकिन सबसे शायद ModelForm में भी (यह प्रयास नहीं किया है) होगा।

मेरे Django संस्करण है:

>>> import django 
>>> django.get_version() 
u'1.1 alpha 1 SVN-10105' 
+0

ठीक है, यह समाधान अच्छा है, लेकिन मैं AdminDateWidget के साथ इसका उपयोग कैसे कर सकता हूं? यह विजेट मेरे मल्टीविजेट का हिस्सा है। – alekwisnia

1

ऐसा लगता है कि यह not yet supported है, जैसा कि मैं इसे समझता हूं, इसलिए हाँ, आपको अभी कुछ कस्टम कार्य करना होगा।

2

आपको इसे अभी करना है, लेकिन कस्टम फॉर्म फ़ील्ड क्लास के साथ करना काफी आसान है जो डेटफिल्ड के input_formats तर्क को सेट करता है। यह यह करना चाहिए:

class MyDateField(forms.DateField): 
    def __init__(self, *args, **kwargs): 
    kwargs.setdefault('input_formats', ("%d-%m-%Y",)) 
    super(MyDateField, self).__init__(*args, **kwargs) 

ध्यान दें कि input_formats एक सूची है, तो आप एकाधिक संभावनाओं निर्दिष्ट कर सकते हैं और जब उपयोगकर्ता इनपुट को पार्स यह क्रम में उन्हें कोशिश करेंगे।

+0

मैं इसे अपने नए रूपों पर लागू कर सकता हूं, लेकिन, मैं व्यवस्थापक साइट में डिफ़ॉल्ट फॉर्म फ़ील्ड को ओवरराइड कैसे कर सकता हूं? – Andor

2

मैं सेटिंग को संशोधित किया है जिससे वह l10n और निर्धारित तिथि प्रारूप explicite अक्षम कर देता है:

USE_L10N = False 
DATE_FORMAT = 'd-m-Y' 
DATETIME_FORMAT = 'd-m-Y H:i' 

साथ ही आप DATE_INPUT_FORMATS सेट कर सकते हैं।

9

Django ticket 6483 & Django 1.2 के रिलीज के बाद से ऐसा करने का आधिकारिक तरीका है।

आप False को USE_L10N सेट है, तो क्या आपको क्या करना चाहिए DATE_INPUT_FORMATS और अपने settings.py में DATETIME_INPUT_FORMATS निर्दिष्ट है। यहां वे सेटिंग मैं इस के लिए उपयोग करते हैं, चूक परिवर्तित करने के आधार पर कर रहे हैं:

#dd/mm/yyyy and dd/mm/yy date & datetime input field settings 
DATE_INPUT_FORMATS = ('%d-%m-%Y', '%d/%m/%Y', '%d/%m/%y', '%d %b %Y', 
         '%d %b, %Y', '%d %b %Y', '%d %b, %Y', '%d %B, %Y', 
         '%d %B %Y') 
DATETIME_INPUT_FORMATS = ('%d/%m/%Y %H:%M:%S', '%d/%m/%Y %H:%M', '%d/%m/%Y', 
          '%d/%m/%y %H:%M:%S', '%d/%m/%y %H:%M', '%d/%m/%y', 
          '%Y-%m-%d %H:%M:%S', '%Y-%m-%d %H:%M', '%Y-%m-%d') 

आप True को USE_L10N सेट है, तो आप के बजाय FORMAT_MODULE_PATH उपयोग करने के लिए की आवश्यकता होगी।

उदाहरण के लिए, मेरी LANGUAGE_CODEen-au के लिए सेट है, मेरी साइट golf कहा जाता है, और मेरे FORMAT_MODULE_PATH, golf.formats पर सेट है तो मेरे निर्देशिका संरचना इस तरह दिखता है:

golf/ 
    settings.py 
    ... 
    formats/ 
     __init__.py 
     en/ 
      __init__.py 
      formats.py 

और DATE_INPUT_FORMATS और DATETIME_INPUT_FORMATS सेटिंग नहीं है settings.py के बजाय formats.py में।

+1

मेरे लिए एक इलाज किया। धन्यवाद! –

0

बस इसे एक स्ट्रिंग के रूप में लिखने के लिए सावधान रहें, लेकिन एक ट्यूपल के रूप में। जैसे:

DATE_INPUT_FORMATS = ('%d.%m.%Y',) 

आप एक के रूप में लेखन की तारीख का केवल एक वैध तरीका है करना चाहते हैं।

संबंधित मुद्दे