gpt4 book ai didi

python - 测试从 Django 中的数据库获取选择的表单 - 不允许数据库访问

转载 作者:行者123 更新时间:2023-12-01 07:18:47 25 4
gpt4 key购买 nike

我对我的表单进行了一个测试,该测试出错了,因为我有从模型填充的表单选择。错误看起来像这样:

../myapp/tests/test_forms.py:5: in <module>
from myapp.forms import AssignmentForm, AssignmentFormSet
myapp/forms.py:135: in <module>
class MyDetailForm(forms.ModelForm):
myapp/forms.py:138: in MyDetailForm
choices=[(ey.end_year, ey.full_label()) for ey in Year.objects.all()]
venv/lib/python3.7/site-packages/django/db/models/query.py:268: in __iter__
self._fetch_all()
venv/lib/python3.7/site-packages/django/db/models/query.py:1186: in _fetch_all
self._result_cache = list(self._iterable_class(self))
venv/lib/python3.7/site-packages/django/db/models/query.py:54: in __iter__
results = compiler.execute_sql(chunked_fetch=self.chunked_fetch, chunk_size=self.chunk_size)
venv/lib/python3.7/site-packages/django/db/models/sql/compiler.py:1063: in execute_sql
cursor = self.connection.cursor()
venv/lib/python3.7/site-packages/django/db/backends/base/base.py:255: in cursor
return self._cursor()
venv/lib/python3.7/site-packages/django/db/backends/base/base.py:232: in _cursor
self.ensure_connection()
E Failed: Database access not allowed, use the "django_db" mark, or the "db" or "transactional_db" fixtures to enable it.

它似乎不喜欢我在 MyDetailForm 中为我的选择获取 Year 对象,如下所示:

class MyDetailForm(forms.ModelForm):

end_year = forms.ChoiceField(
choices=[(ey.end_year, ey.full_label()) for ey in Year.objects.all()]
)

class Meta:
model = MyDetail
fields = ["end_year", "is_current"]
labels = {"is_current": "Current Sections"}

这是一个很大的禁忌吗?我如何解决这个问题以便我的测试能够真正运行?

此错误在我的测试运行之前出现,因此它发生在我的导入语句期间。

如果我将 [(ey.end_year, ey.full_label()) for ey in Year.objects.all()] 更改为 [] 我的测试运行为预期的,但我不想仅仅为了测试目的而改变 forms.py 中的内容...

最佳答案

在您的选择中使用可调用对象。

def get_year_choices():
return [(ey.end_year, ey.full_label()) for ey in Year.objects.all()]

class MyDetailForm(forms.ModelForm):

end_year = forms.ChoiceField(
choices=get_year_choices
)

然后您可以在测试中修补 get_year_choices

将代码移动到可调用对象还意味着实例化表单时将查询数据库。目前,查询在 Django 加载时发生,这可能会在迁移新数据库时导致错误,或导致过时的结果。

关于python - 测试从 Django 中的数据库获取选择的表单 - 不允许数据库访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57809389/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com