У меня проблема с попыткой получить действительную форму в pytest.Я проверяю изменения данных с помощью действия администратора Django.Независимо от того, какие данные я отправляю в форму, form.is_valid()
всегда будет возвращать False
.Передача словаря в форму напрямую работает, однако я хотел бы иметь возможность протестировать действие, чтобы убедиться, что действие отфильтровывает заблокированные записи.
# test_admin.py
@pytest.mark.django_db
class BaseTestCase(TestCase):
"""Base TestCase with utilites to create user and login client."""
def setUp(self):
"""Class setup."""
self.index_url = '/'
self.login()
self.django_db_setup()
def create_user(self):
"""Create user and returns username, password tuple."""
username, password = 'testadmin', 'password123'
user = User.objects.create_superuser(
username,
'admin@test.com',
password,
first_name='Admin',
last_name='Account',
)
self.user = user
return (username, password)
def login(self):
"""Log in client session."""
username, password = self.create_user()
self.client.login(username=username, password=password)
@staticmethod
def django_db_setup():
call_command('loaddata', 'fixtures/fixture.json')
class AdminTestCase(BaseTestCase):
def test_responsible_list(self):
products = Product.objects.filter(pk__in=[230005, 229724])
form_data = {
'action': 'set_product_class',
'apply': 'Submit',
'product_class': '1',
ACTION_CHECKBOX_NAME: products.values_list('pk', flat=True),
}
self.client.post('/admin/store/product/', form_data, follow=True)
# Assert product_classes have changed
# actions.py
def set_product_class(modeladmin, request, queryset):
# Exclude products that are locked
queryset = queryset.exclude(is_locked=True)
form = None
if 'apply' in request.POST:
form = SetProductClassForm(data=request.POST)
if form.is_valid():
# action code
# forms.py
class SetProductClassForm(forms.Form):
_selected_action = forms.CharField(widget=forms.MultipleHiddenInput)
product_class = forms.ModelChoiceField(ProductClass.objects.all())
Я поместил трассировку pdb над строкойв действии, где он проверяет if form.is_valid():
Когда я запускаю это в pytest:
(Pdb) form.is_valid()
False
(Pdb) request.POST
<QueryDict: {u'action': [u'set_product_class'], u'apply': [u'Submit'], u'product_class': [u'1'], u'_selected_action': [u'230005', u'229724']}>
Однако, если я запускаю тот же код через оболочку Django, форма действительна:
(Pdb) form.is_valid()
True
(Pdb) request.POST
<QueryDict: {u'action': [u'set_product_class'], u'apply': [u'Submit'], u'product_class': [u'1'], u'_selected_action': [u'230005', u'229724']}>
Почему я не могу получить действительную форму через pytest?