Pro*_*e85 6 python django ipython django-forms
使用语言环境设置时,Django shell表现出(至少对我而言)意外.逗号分隔的十进制字段的表单验证在从外部脚本调用时起作用,而在从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
Run Code Online (Sandbox Code Playgroud)
local_forms/models.py:
from django.db import models
class MyModel(models.Model):
val=models.DecimalField("value",max_digits=11,decimal_places=2)
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
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)
Run Code Online (Sandbox Code Playgroud)
调用./test_form.py会产生:
./test_form.py
True
Separator: .
Language: de-de
Is bound: True
Form valid True
Errors in val:
Run Code Online (Sandbox Code Playgroud)
在django shell中做同样的事情: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.']
Run Code Online (Sandbox Code Playgroud)
总结:如果我启动django shell(在我的电脑上使用ipython),语言环境不知何故不起作用.在脚本中完全相同可以完美地运行.你能解释一下这种行为吗?
Django管理命令,包括shell
,重置语言'en-us'
,因此你的问题.这种行为的解释在Django文档中:
默认情况下,BaseCommand.execute()方法设置硬编码的"en-us"语言环境,因为Django附带的一些命令执行需要系统中性字符串语言的多个任务(例如,面向用户的内容呈现和数据库填充)(为此我们使用'en-us').
如果激活正确的语言,您的示例在shell中可以正常工作:
>>> 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
Run Code Online (Sandbox Code Playgroud)
另外,您应该始终使用当前语言get_locale()
而不是依赖来检查settings
.
归档时间: |
|
查看次数: |
876 次 |
最近记录: |