2013-04-26 22 views
6

Powłoka Django zachowuje się (przynajmniej dla mnie) nieoczekiwanie podczas pracy z ustawieniami narodowymi. Formularz sprawdzania poprawności pola dziesiętnego oddzielonego przecinkami działa podczas wywoływania ze skryptu zewnętrznego i kończy się niepowodzeniem podczas wywoływania z powłoki django (ipython).Python django powłoki (ipython) nieoczekiwane zachowanie lub błąd?

Rozpoczynanie nowego projektu mam następujące pliki:

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) 

Wywoływanie ./test_form.py plony:

./test_form.py 

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

robi to samo w Django skorupy: 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.'] 

Podsumowując: jeśli zacznę powłokę django (który na moim komputerze używa ipython) locale jakoś nie działa. Zrobienie tego samego w scenariuszu działa doskonale. Czy możesz wyjaśnić to zachowanie?

+0

Testowałem to za pomocą tłumacza bpython i otrzymałem ten sam błąd. Może niektóre ustawienia nie zostaną zaimportowane lub ścieżka nie zostanie załadowana. –

Odpowiedz

6

Komendy zarządzania Django, w tym shell, zresetować język do 'en-us', stąd Twój problem. Wyjaśnienie tego problemu jest w the Django Documentation:

Domyślnie BaseCommand.execute() metoda ustawia ustalony „en-us” locale ponieważ niektóre polecenia wysyłane z Django wykonać kilka zadań (na przykład użytkownik wychodzący renderowanie treści i populacja bazy danych), które wymagają neutralnego systemowo języka ciągów znaków (dla którego używamy "en-us").

Twój przykład działa w powłoce, jeśli aktywować odpowiedni język:

>>> 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 

Na marginesie, zawsze należy sprawdzić aktualny język za pomocą get_locale() zamiast opierania się na settings.

+0

Wielkie dzięki, zajęło mi cały dzień, aby dowiedzieć się, że to ze względu na powłokę. Może powinno być jakieś ostrzeżenie, ale to jest pytanie – ProfHase85

Powiązane problemy