2013-04-26 24 views
6

使用语言环境设置时,Django shell的行为(至少对我而言)是意外的。当从外部脚本调用并且从django shell(ipython)调用失败时,逗号分隔的十进制字段的表单验证工作。python django shell(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外壳同样的事情: 蟒蛇manage.py壳

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的壳(这在我的电脑上使用ipython)语言环境不知何故无法正常工作。在脚本中完全一样地完美工作。 你能解释这种行为吗?

+0

用bpython解释器测试过,并得到相同的错误。也许是一些设置没有得到导入或一些路径没有得到加载。 – 2013-04-26 18:46:04

回答

6

Django管理命令,包括shell,重置语言为'en-us',因此您的问题。这种行为的解释是the Django Documentation

默认情况下,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当前语言。

+0

非常感谢,我花了一整天的时间才发现它是因为壳。也许应该有某种警告,但这是另一个问题 – ProfHase85 2013-04-26 19:20:56

相关问题