2013-04-26 16 views
6

Yerel ayarlarla çalışırken Django kabuğu (en azından benim için) beklenmedik şekilde davranır. Virgülle ayrılmış bir ondalık alanın form doğrulaması, harici komut dosyasından arama yaparken çalışır ve django kabuğu (ipython) çağrısında başarısız olur.python django kabuğu (ipython) beklenmedik davranış veya hata?

aşağıdaki dosyaları var yeni Projesi Başlangıç:

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) 
012 Django kabuğunda aynı şeyi yapmak

./test_form.py 

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

:

çağrılması ./test_form.py verimleri piton

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

Özetle kabuk manage.py i Django kabuğunu başlatırsanız (benim pc üzerinde ipython kullanır) locale bir şekilde çalışmıyor. Bir betikte tam olarak aynı şeyi yapmak mükemmel çalışır. Bu davranışı açıklayabilir misiniz?

+0

Bpython yorumlayıcısı ile test edildi ve aynı hatayı aldı. Belki bazı ayarlar içe aktarılmıyor ya da bazı yollar yüklenmiyor. –

cevap

6

shell da dahil olmak üzere Django yönetim komutları, dili 'en-us' olarak sıfırlar, böylece sorununuzu giderir. Bu davranışın açıklaması the Django Documentation içindedir: Varsayılan olarak

, BaseCommand.execute() yöntemi kodlanmış 'en-us' yerel ayarında Django ile sevk bazı komutlar (örneğin birkaç görevleri gerçekleştirmek çünkü setleri, kullanıcı bakan Sistem yansız bir dize dili gerektiren (içerik oluşturma ve veritabanı popülasyonu) ('en-us' kullanıyoruz). Doğru dili etkinleştirmek eğer

Sizin örnek kabuğunda çalışır:

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

Yan not, her zaman get_locale() kullanarak yerine settings dayanarak geçerli dilini kontrol edilmelidir.

+0

Çok teşekkürler, kabuk yüzünden olduğunu öğrenmek bütün günümü aldı. Belki bir çeşit uyarı olmalı, ama bu bir soru – ProfHase85

İlgili konular