2010-07-08 89 views
17

我正在編寫一個Django應用程序,用於使用逗號作爲decimal separator的國家/地區。我有一個包含django.db.models.DecimalField的模型,我使用model forms。我如何使用逗號作爲結果表單字段渲染,並接受用戶的逗號?使Django窗體使用逗號作爲小數點分隔符

jweyrichadvice,我已經升級,從Django的1.1我的應用程序的Django 1.2和編輯我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中工作。

我發現了一個Django ticket和從1.2發佈之前產生的Django changeset。如果我正確地理解了它們,過去小部件會自動使用格式本地化,但在此修補程序本地化之後,必須通過將localization=True關鍵字參數提供給表單字段來明確打開。有沒有辦法讓管理員在他們的字段上設置localization=True

回答

21

是的,本地化確實需要明確打開每個字段。對於模型的形式(包括在管理應用程序所使用的那些),方便的方式做到這一點是繼承的ModelForm並開啓本地化每個DecimalField:

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類,並使用它在管理應用程序:

class FooForm(LocalizedModelForm): 

    class Meta: 
     model = Foo 


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

輝煌而優雅的解決方案。 – scum 2011-08-14 20:42:33

+4

我寧願把它變成一個mixin:'LocalizationMixin(object):...'和'FooForm(LocalizationMixin,forms.ModelForm)',所以你可以繼續使用例如。 'FooForm(LocalizationMixin,floppyforms.ModelForm)' – Webthusiast 2011-12-12 14:54:55

+0

如果您想直接爲模型啓用本地化,該怎麼辦?不是ModelForms。用例:查看對AJAX HTTP請求發佈數據的響應,並且希望將該數據(包含逗號作爲千位分隔符的數字)存儲在帶有Decimal字段的模型中。找不到解決方案。 – jorgeas80 2016-09-15 09:21:58

8

對,這看起來像一個惱人的破損,我很驚訝沒有人報告。由於您提到的更改,您的管理應用或模型表單中的每個字段都必須明確啓用本地化。做到這一點的最好方法是定義一個自定義的ModelForm,以便在管理員和應用中使用,並設置widgets字典以在每個相關字段上啓用本地化。

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

這隻在HTML中設置了一個屬性,但是你把我放在了正確的軌道上(一個自定義的ModelForm原來是要走的路),所以你得到了賞金。謝謝!我將發佈工作解決方案作爲單獨的答案。 – 2010-08-07 10:05:57

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

而對於forms.Form,'forms.DecimalField(label ='Foo',localize = True)'起作用。 – chhantyal 2015-01-09 09:42:22

+0

多餘的括號圍繞'__all__' – Chris 2017-03-10 10:28:53

+0

改變了它,謝謝@Chris – zvyn 2017-03-15 05:11:25

相關問題