6

ロケール設定を使用する場合、Django シェルは (少なくとも私にとっては) 予期しない動作をします。コンマ区切りの 10 進数フィールドのフォーム検証は、外部スクリプトから呼び出すと機能し、django シェル (ipython) から呼び出すと失敗します。

新しいプロジェクトを開始すると、次のファイルが得られました。

local_forms/
├── local_forms
│   ├── __init__.py
│   ├── models.py
│   ├── settings.py
│   ├── urls.py
│   └── wsgi.py
├── manage.py
├── my_form.py
├── test_form.py

local_forms/models.py:

from django.db import models

class MyModel(models.Model):
    val=models.DecimalField("value",max_digits=11,decimal_places=2)

my_form.py

from django import forms
from django.conf import settings
from local_forms.models import MyModel


class MyForm(forms.ModelForm):
    val = forms.DecimalField(localize=True)

    def __init__(self,*args,**kwargs):
        super(MyForm,self).__init__(*args,**kwargs)
        self.fields['val'].localize=True
        if __debug__:
            print self.fields['val'].localize
            print ("Separator: "+settings.DECIMAL_SEPARATOR)
            print ("Language: " +settings.LANGUAGE_CODE)

    class Meta:
        model=MyModel

test_form.py:

#!/usr/bin/env python
import os
import sys

if __name__ == "__main__":
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "local_forms.settings")

    import my_form

    form=my_form.MyForm({'val':'0,2'})

    print ("Is bound: %s" % form.is_bound)
    print ("Form valid %s" % form.is_valid())
    print("Errors in val: %s" % form['val'].errors)

./test_form.py を呼び出すと、次の結果が得られます。

./test_form.py

True
Separator: .
Language: de-de
Is bound: True
Form valid True
Errors in val: 

django シェルで同じことを行う: python manage.py shell

In [1]: import my_form as mf

In [2]: form=mf.MyForm({'val':'0,2'})
True
Separator: .
Language: de-de

In [3]: form.is_valid()
Out[3]: False

In [4]: form['val'].errors
Out[4]: [u'Enter a number.']

要約すると、djangoシェル(私のPCではipythonを使用)を起動すると、ロケールが何らかの形で機能しません。スクリプトでまったく同じことを行うと、完全に機能します。この振る舞いを説明していただけますか?

4

1 に答える 1

6

を含む Django 管理コマンドはshell、言語を にリセットする'en-us'ため、問題が発生します。この動作の説明は、Django ドキュメントにあります。

デフォルトでは、BaseCommand.execute() メソッドは、ハードコードされた「en-us」ロケールを設定します。これは、Django に同梱されている一部のコマンドが、システムに中立な文字列言語 (そのために「en-us」を使用します)。

適切な言語を有効にすると、例はシェルで機能します。

>>> from django.utils.translation import get_language
>>> get_language()
  > 'en-us'
>>> import my_form as mf
>>> form=mf.MyForm({'val':'0,2'})
True
Separator: .
Language: de-de
>>> form.is_valid()
  > False
>>> from django.utils.translation import activate
>>> activate('de-de')
>>> get_language()
  > 'de-de'
>>> form=mf.MyForm({'val':'0,2'})
True
Separator: .
Language: de-de
>>> form.is_valid()
  > True

get_locale()ちなみに、に依存するのではなく、を使用して現在の言語を常に確認する必要がありますsettings

于 2013-04-26T19:12:44.413 に答える