2009-09-21 8 views
7

का उपयोग करें, मैं ऑस्ट्रेलियाई प्रारूप (डीडी/मिमी/yyyy) में तिथियां दिखाने वाले फ़ॉर्म बनाने के लिए एक आसान तरीका खोजने की कोशिश कर रहा हूं। यह एकमात्र तरीका था जिसे मैं कर सकता था। ऐसा लगता है कि एक बेहतर समाधान होना चाहिए।Django फॉर्म बनाना .डेटफिल्ड शो स्थानीय दिनांक प्रारूप

बातें ध्यान रखें:

  • एक नया विजेट जो dd/mm/yyyy प्रारूप में दिनांक मान renders
  • निर्मित नई तारीख क्षेत्र मानों की सूची यह कोशिश करता है करने के लिए तिथि का पता लगाने प्रारूप स्ट्रिंग पहले जोड़ें करने के लिए बनाया गया

उपयोग करने के लिए मुझे लगता है आदर्श समाधान एक datefield जो स्वचालित रूप से स्थानीय होगा, लेकिन यह मेरे लिए काम नहीं किया (strftime यूनिकोड अनुकूल प्रतीत नहीं किया था, लेकिन मैं बहुत मेहनत की कोशिश नहीं की)

क्या मुझे कुछ याद आ रही है? क्या कोई और सुरुचिपूर्ण समाधान है? क्या यह एक मजबूत दृष्टिकोण है?

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() 
+2

एक सामान्य विकल्प जावास्क्रिप्ट कैलेंडर विजेट पर भरोसा करने के स्थानीयकरण करना है। हम जो भी उपयोग करते हैं वह केवल मेरे दिनांक फ़ील्ड को छुपाता है और निर्दिष्ट स्थानीय स्वरूपण के साथ दूसरा बनाता है। – olivergeorge

+0

विशेष विगेट्स पर कोई जानकारी और विजेट को हुकिंग करना? – dfrankow

+0

मुझे लगता है कि मुझे स्टैक ओवरफ्लो प्रश्न का संदर्भ लेना चाहिए: http://stackoverflow.com/questions/114068/best-javascript-calendar-control। – dfrankow

उत्तर

10

दी, मैं एक Django/अजगर जेडी नहीं कर रहा हूँ, लेकिन ...

मुझे नहीं लगता कि कुछ भी अपने दृष्टिकोण के साथ कुछ गलत है है। यह एक साफ पढ़ा है।

आपको पहले फॉर्म डिस्प्ले पर उचित प्रारूप में दिनांक प्रस्तुत करने के लिए अपना स्वयं का विजेट बनाने की आवश्यकता नहीं हो सकती है। DateInput विजेट के लिए बस format पैरामीटर का उपयोग करें और आपको ठीक होना चाहिए। अपने 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 इस्तेमाल कर सकते हैं (यह दूर से संबंधित सवाल के लिए accepted answer देखें), जिसका अर्थ है:

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 पर कॉल करना चाहते हैं - मॉडलफॉर्म वंश की आवश्यकता, formfield_callback=customize_fields को अपने सभी फॉर्म वर्गों के लिए नए आधार के रूप में लागू करना।

formfield_callback प्रणाली का उपयोग कर के साथ मेरा समस्या दो गुना है:

  1. यह कम पढ़ी जा सकती है और ModelForms की अंदरूनी कामकाज के ज्ञान में निर्भर करता है। मुझे फॉर्मफील्ड_callback पर कहीं भी वास्तविक दस्तावेज नहीं मिल रहा है ...

  2. यदि आपको कभी भी मॉडलफॉर्म में मॉडल फ़ील्ड को फिर से परिभाषित करने की आवश्यकता है, तो फ़ील्ड को उस विशेष उदाहरण के लिए फ़ील्ड की आवश्यकता नहीं है, जैसे:

    class MyModelForm(forms.ModelForm): 
         formfield_callback = customize_fields 
         foo = forms.DateField(required=false) 
    
         class Meta: 
          model = Bar 
    

    आप custom_fields द्वारा लौटाए गए फॉर्म फ़ील्ड को ओवरराइट कर रहे हैं, इसलिए पूरी तरह से अनुकूलन खोना है।

मुझे लगता है कि आपका दृष्टिकोण अधिक पठनीय है।

+0

इसके अलावा, इसे देखें: http://code.djangoproject.com/ticket/7980 – cethegeek

6

मैंने पहले इस सरल दृष्टिकोण का उपयोग किया है: बस डेटफिल्ड की 'प्रारूप' विशेषता सेट करें।फॉर्म की init में विजेट:

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'] 
0

मेरी रूप में उपयोग करते हुए I'me:

def today(): 
    from datetime import date 
    return date.today().strftime("%d.%m.%Y") 

when = models.DateField(u'Когда', default=today) 
2

कस्टम विजेट सामान के सभी को नजरअंदाज किया जा सकता है।

यहाँ 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 इनमें से पहला चयन करता है। प्रारूप को बदलने के लिए पूरी तरह से दृष्टिकोण अपने स्वयं के स्वरूप मॉड्यूल को बनाना है, जो सवाल में लोकेल के लिए डीजेगो के डिफ़ॉल्ट को ओवरराइड करना है। इसके लिए, 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 
संबंधित मुद्दे