我们正在为Speedy Net and Speedy Match使用Django(目前是Django 1.11.17,由于我们的一个需求Django modeltransflation,我们无法升级到Django的更新版本)。我想把我们的一些设置定义为类。例如:
class UserSettings(object):
MIN_USERNAME_LENGTH = 6
MAX_USERNAME_LENGTH = 40
MIN_SLUG_LENGTH = 6
MAX_SLUG_LENGTH = 200
# Users can register from age 0 to 180, but can't be kept on the site after age 250.
MIN_AGE_ALLOWED_IN_MODEL = 0 # In years.
MAX_AGE_ALLOWED_IN_MODEL = 250 # In years.
MIN_AGE_ALLOWED_IN_FORMS = 0 # In years.
MAX_AGE_ALLOWED_IN_FORMS = 180 # In years.
MIN_PASSWORD_LENGTH = 8
MAX_PASSWORD_LENGTH = 120
PASSWORD_VALIDATORS = [
{
'NAME': 'speedy.core.accounts.validators.PasswordMinLengthValidator',
},
{
'NAME': 'speedy.core.accounts.validators.PasswordMaxLengthValidator',
},
]
(在https://github.com/speedy-net/speedy-net/blob/staging/speedy/net/settings/global_settings.py中定义)。然后在模型中,我尝试使用:
^{pr2}$(然后在类中使用settings
的属性,例如settings.MIN_USERNAME_LENGTH
)。在
但它引发了一个例外
AttributeError: 'Settings' object has no attribute 'UserSettings'
(但是如果我在那里使用一个不是类的常量,它不会引发异常)。在
这是第一个问题。与此同时,我定义了:
from speedy.net.settings import global_settings as speedy_net_global_settings
class User(ValidateUserPasswordMixin, PermissionsMixin, Entity, AbstractBaseUser):
settings = speedy_net_global_settings.UserSettings
第二个问题是如何在测试中覆盖这些设置?例如,我使用以下代码:
from speedy.core.settings import tests as tests_settings
@override_settings(MAX_NUMBER_OF_FRIENDS_ALLOWED=tests_settings.OVERRIDE_MAX_NUMBER_OF_FRIENDS_ALLOWED)
在https://github.com/speedy-net/speedy-net/blob/staging/speedy/core/friends/tests/test_views.py中。但是如果MAX_NUMBER_OF_FRIENDS_ALLOWED
将在UserSettings
类中定义,我如何覆盖它?在
Django不希望您偏离它的低级设计选择,而且通常很难处理Django不允许您定制的东西。在
Django的settings对象explicitly skips over设置模块中任何非大写名称的对象。如果您将您的类重命名为
USER_SETTINGS
,它将工作。如果您真的想保留对象的原始名称,一个可怕的解决方案是欺骗Django:我不知道这是否可以跨Python实现移植,但它可以与CPython的
dir()
配合使用。override_settings
不支持您正在尝试的操作,因此您可能需要重写该类以允许全局settings
对象可配置。感谢@Blender的提示:
我不知道所有的设置。所以我将
class UserSettings
重命名为class USER_SETTINGS
(虽然PyCharm不喜欢它),但是我检查了一下,还可以在文件末尾添加以下代码:不重命名类。在
至于我的第二个问题-如何在测试中覆盖这些设置?我添加了一个名为
^{pr2}$utils.py
的文件:(可以在https://github.com/speedy-net/speedy-net/blob/staging/speedy/core/base/test/utils.py上看到)
然后在测试中:
我检查过了,我必须定义另一个类(在本例中,
class django_settings_class_with_override_settings
),因为如果我直接更改这个类django_settings_class
,它也会影响其他没有使用@override_settings
的测试。在相关问题 更多 >
编程相关推荐