【发布时间】:2019-05-25 08:41:43
【问题描述】:
我们将 Django 用于Speedy Net and Speedy Match(当前为 Django 1.11.17,由于我们的要求之一 django-modeltranslation,我们无法升级到更新版本的 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 中定义)。然后在模型中,我尝试使用:
from django.conf import settings as django_settings
class User(ValidateUserPasswordMixin, PermissionsMixin, Entity, AbstractBaseUser):
settings = django_settings.UserSettings
(然后在类中使用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 中定义,我该如何覆盖它?
【问题讨论】:
-
为什么要使用类?为什么不是字典?
-
我想是因为有了一个类,我可以继承它们并且只改变我想要的。但是可以用字典做类似的事情。类在代码中也更具可读性。无论如何,我想知道如何用字典覆盖设置。
-
@Uri:看看
modify_settings是如何处理列表的,以及如何处理字典的类似操作。如果你想做“继承”,我发现制作一个settings模块并创建子模块也可以,settings/__init__.py做from .submodule import *; OVERRIDE_THING = True来模拟继承。
标签: python django python-3.x overriding django-settings