【问题标题】:python django shell (ipython) unexpected behavior or bug?python django shell (ipython) 意外行为或错误?
【发布时间】:2013-04-26 18:33:01
【问题描述】:

在使用区域设置时,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

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

总结一下:如果我启动 django shell(在我的电脑上使用 ipython),语言环境不知何故不起作用。在脚本中执行完全相同的操作非常有效。 你能解释一下这种行为吗?

【问题讨论】:

  • 用 bpython 解释器测试它并得到同样的错误。可能是某些设置未导入或某些路径未加载。

标签: python django django-forms ipython


【解决方案1】:

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

默认情况下,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

附带说明,您应该始终使用 get_locale() 而不是依赖 settings 检查当前语言。

【讨论】:

  • 非常感谢,我花了一整天才发现是shell的原因。也许应该有某种警告,但这是另一个问题
猜你喜欢
  • 1970-01-01
  • 2015-09-04
  • 2018-04-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-27
  • 2020-09-14
相关资源
最近更新 更多