我有一个Django的可插拔应用程序,它提供了一些表单。表单有一些与之相关的设置,可以控制某些表单的行为(例如,标签,初始值等)。
我已按照blog post设置可插拔应用的默认设置,这在正常情况下效果很好。但是,在我提供覆盖的测试中,覆盖根本不会应用。
以下是其中一种表格的代码:
if settings.CURRENCY_FORM_INCLUDE_EMPTY:
currencies.insert(0, (settings.CURRENCY_FORM_EMPTY_VALUE,
settings.CURRENCY_FORM_EMPTY_LABEL))
class CurrencyForm(forms.Form):
currency = forms.ChoiceField(
required=False,
choices=currencies,
label=settings.CURRENCY_FORM_LABEL,
initial=settings.CURRENCY_FORM_INITIAL_VALUE)
显然,定义了时刻类,会立即应用标签和初始值等设置,因此覆盖对它们没有影响。
我最终得到了一个相当狡猾的解决方案来评估表单的__init__
方法中的所有设置:
class CurrencyForm(forms.Form):
def __init__(self, *args, **kwargs):
super(CurrencyForm, self).__init__(*args, **kwargs)
choices = list(currencies)
if settings.CURRENCY_FORM_INCLUDE_EMPTY:
choices.insert(0, (settings.CURRENCY_FORM_EMPTY_VALUE,
settings.CURRENCY_FORM_EMPTY_LABEL))
self.fields['currency'].label = settings.CURRENCY_FORM_LABEL
self.fields['currency'].choices = choices
self.fields['currency'].initial = kwargs.get(
'initial', {}
).get('currency', settings.CURRENCY_FORM_INITIAL_VALUE)
currency = forms.ChoiceField(required=False,
choices=())
显然,很多活动部件。我对这段代码不太满意。如何在不诉诸这些黑客的情况下正确测试设置对表单的影响?
答案 0 :(得分:0)
我不知道你想要做什么。但作为建议,您应该以更加面向对象的方式来思考。例如,您应该定义所有内容并插入您使用的内容,而不是使用if
语句。
如果您有两个表单,并且每次都想使用其中一个表单,则可以进行一些设置,例如:
settings.FORM_TO_USE = CurrencyForm
当你想要实例化时,你可以这样做:
def my_view(request):
form = settings.FORM_TO_USE()
最后,尝试与配置分开管理测试。如果你正在测试django,它应该不关心设置是什么。