2010-07-08 18 views
17

के रूप में अल्पविराम का उपयोग करें, मैं एक देश में उपयोग के लिए एक Django ऐप लिख रहा हूं जहां वे decimal separator के रूप में अल्पविराम का उपयोग करते हैं। मेरे पास एक मॉडल है जिसमें django.db.models.DecimalField है, और मैं model forms का उपयोग करता हूं। मैं परिणामी फॉर्म फ़ील्ड को अल्पविराम का उपयोग करके कैसे प्रस्तुत कर सकता हूं और उपयोगकर्ता से कॉमा वापस स्वीकार कर सकता हूं?Django फॉर्म को दशमलव विभाजक

jweyrich की advice के बाद, मैं 1.2 Django के लिए Django 1.1 से अपने आवेदन के लिए उन्नत और मेरे settings.py संपादित निम्नलिखित शामिल करने के लिए है:

LANGUAGE_CODE = 'nb' 
LANGUAGES = (
    ('nb', 'Norwegian'), 
) 
USE_I18N = True 
USE_L10N = True 
DECIMAL_SEPARATOR = ',' 
THOUSAND_SEPARATOR = ' ' 
MIDDLEWARE_CLASSES = (
    'django.contrib.sessions.middleware.SessionMiddleware', 
    'django.middleware.locale.LocaleMiddleware', 
    'django.middleware.common.CommonMiddleware', 
    'django.contrib.auth.middleware.AuthenticationMiddleware', 
    'django.middleware.csrf.CsrfViewMiddleware', 
) 

जहां तक ​​मैं देख सकता हूँ, यह सब है कि the documentation कॉल है के लिये। अगर मैं फॉर्म फ़ील्ड पर localization=True सेट करता हूं तो यह अब फॉर्म के लिए काम करता है। यह न तो model forms और न ही the admin site में काम करता है।

मैंने 1.212 रिलीज से पहले Django ticket और परिणामी Django changeset खोजा। अगर मैं उन्हें सही ढंग से समझ रहा हूं, तो यह वही मामला होता था जब विजेट्स ने स्थानीयकरण को स्वचालित रूप से प्रारूपित किया था, लेकिन इस पैच स्थानीयकरण को फॉर्म फ़ील्ड में localization=True कीवर्ड पैरामीटर देकर स्पष्ट रूप से चालू किया जाना चाहिए। क्या उनके फॉर्म पर व्यवस्थापक फॉर्म localization=True सेट करने का कोई तरीका है?

उत्तर

21

हां, स्थानीयकरण को हर क्षेत्र के लिए स्पष्ट रूप से चालू करने की आवश्यकता है।

import django 

class LocalizedModelForm(django.forms.ModelForm): 
    def __new__(cls, *args, **kwargs): 
     new_class = super(LocalizedModelForm, cls).__new__(cls, *args, **kwargs) 
     for field in new_class.base_fields.values(): 
      if isinstance(field, django.forms.DecimalField): 
       field.localize = True 
       field.widget.is_localized = True 
     return new_class 

तो फिर आप अपने कस्टम ModelForm वर्ग और उपयोग को परिभाषित कर सकते हैं: (व्यवस्थापक ऐप में उपयोग भी शामिल होते हैं) एक मॉडल फार्म के लिए, यह करने के लिए एक सुविधाजनक तरीका ModelForm उपवर्ग और प्रत्येक DecimalField के लिए स्थानीयकरण चालू करने के लिए है यह व्यवस्थापक ऐप्स में:

class FooForm(LocalizedModelForm): 

    class Meta: 
     model = Foo 


django.admin.site.register(Foo, form=FooForm) 
+0

शानदार और सुरुचिपूर्ण समाधान। – scum

+4

मैं इसे एक मिक्सिन बनाना पसंद करूंगा: 'लोकलाइजेशनमिक्सिन (ऑब्जेक्ट): ...' और 'फूफॉर्म (लोकलाइजेशनमिक्सिन, फॉर्म। मॉडेलफॉर्म)', ताकि आप उदाहरण का उपयोग कर सकें। 'FooForm (LocalizationMixin, floppyforms.ModelForm) ' – Webthusiast

+0

क्या होगा यदि आप सीधे मॉडल के लिए स्थानीयकरण सक्षम करना चाहते हैं? मॉडलफॉर्म नहीं केस का उपयोग करें: डेटा पोस्ट करने वाले AJAX HTTP अनुरोध का जवाब देखें, और उस डेटा को एक दशमलव फ़ील्ड वाले मॉडल में उस डेटा को स्टोर करना चाहते हैं (जिसमें अल्पविराम के रूप में अल्पविराम के साथ संख्याएं शामिल हैं)। इसके लिए कोई समाधान नहीं मिल रहा है। – jorgeas80

8

ठीक है, यह एक कष्टप्रद टूटने जैसा दिखता है कि मुझे आश्चर्य है कि किसी ने भी रिपोर्ट नहीं की है। आपके द्वारा उल्लेखित परिवर्तन के कारण, स्थानीयकरण को आपके व्यवस्थापक ऐप या मॉडल फ़ॉर्म में प्रत्येक फ़ील्ड के लिए स्पष्ट रूप से चालू करना होगा। ऐसा करने का सबसे अच्छा तरीका व्यवस्थापक और आपके ऐप में दोनों के लिए कस्टम मॉडलफॉर्म को परिभाषित करना होगा, और प्रत्येक प्रासंगिक फ़ील्ड पर स्थानीयकरण को सक्षम करने के लिए widgets शब्दकोश सेट करें।

class MyModelForm(forms.ModelForm): 
    class Meta: 
     model = MyModel 
     widgets = { 
      'my_decimal_field': forms.TextInput(attrs={'localization': True}), 
     } 
+3

यह केवल HTML में एक विशेषता सेट करता है, लेकिन आपने मुझे सही रास्ते पर रखा है (एक कस्टम मॉडलफॉर्म जाने का तरीका बन गया है), इसलिए आपको बक्षीस मिलती है। धन्यवाद! मैं कामकाजी समाधान को एक अलग उत्तर के रूप में पोस्ट करूंगा। –

7

Django में> = 1.6 वहाँ यह करने के लिए एक सरल उपाय है:

from django.forms import ModelForm 

class YourModelForm(ModelForm): 
    class Meta: 
     model = YourModel 
     localized_fields = '__all__' 

django.admin.site.register(YourModel, form=YourModelForm) 

See the official documentation for a more verbose explanation.

+1

और रूपों के लिए। फॉर्म, 'फॉर्म। डेसिमलफ़िल्ल्ड (लेबल =' फू ', लोकलाइज = ट्रू)' काम करता है। – chhantyal

+0

'__all__' – Chris

+0

के आसपास अनावश्यक कोष्ठक इसे बदल दिया, धन्यवाद @ क्रिस – zvyn

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