Я устранял эту проблему в течение 3 дней. Я думаю, что упускаю что-то фундаментальное в тестировании Create Views или использовании client.post ().
Тест не пройден, потому что ключ даты отсутствует в словаре cleaned_data формы, однако код работает правильно при выполнении из браузера.
Подскажите, пожалуйста, почему ключ даты присутствует в словаре cleaned_data при запуске в браузере, но отсутствует при выполнении client.post () в тесте?
Ниже приведены фрагменты соответствующего кода.
Models.py
class Livestock(CommonInfo):
"""Model definition for Livestock. CommonInfo is an abstract model that contains
created_by, modified_by, date_created, date_modified and comment fields"""
product = models.ForeignKey(
Product, on_delete=models.CASCADE, related_name='livestock')
date = models.DateField(
auto_now=False, auto_now_add=False)
production = models.PositiveIntegerField(
'Livestock produced (Kg or litre or #)')
number_of_animal = models.PositiveIntegerField(
'Number of Animals (Quantity)', blank=True, null=True)
cost_of_production = models.PositiveIntegerField(
'Cost of Production (GYD)', blank=True, null=True)
views.py
class LivestockCreateView(LoginRequiredMixin, PermissionRequiredMixin, CreateView):
model = Livestock
form_class = LivestockForm
success_url = reverse_lazy('real:livestock-list')
template_name = "real/livestock/livestock_form.html"
permission_required = ('real.add_livestock')
def get_initial(self):
initial = super(LivestockCreateView, self).get_initial()
initial['date'] = timezone.now()
return initial
def form_valid(self, form):
form.instance.created_by = self.request.user
return super().form_valid(form)
Forms.py
class LivestockForm(forms.ModelForm):
"""Form definition for Livestock."""
class Meta:
"""Meta definition for Livestockform."""
model = Livestock
fields = ['product', 'date', 'production',
'number_of_animal', 'cost_of_production', 'comment',
'modified_by', 'created_by']
widgets = {
'date': forms.DateInput(attrs={'type': 'date'}),
'modified_by': forms.HiddenInput(),
'created_by': forms.HiddenInput(),
}
def clean(self):
self.cleaned_data = super(LivestockForm, self).clean()
self._validate_unique = True
self.cleaned_data['date'] = self.cleaned_data['date'].replace(day=1)
return self.cleaned_data
test.py
class LivestockTests(TestCase):
@classmethod
def setUpTestData(cls):
cls.User = get_user_model()
cls.user = cls.User.objects.create_user(
username='test_user',
password='testpass123',
first_name='test',
last_name='user'
)
cls.product = Product.objects.create(
name='Milk'
)
def test_livestock_create_view_user_is_login_and_have_permission(self):
self.user.user_permissions.add(
Permission.objects.get(codename='add_livestock'))
login = self.client.login(username='test_user', password='testpass123')
response = self.client.post((reverse('real:livestock-create'),
{'product': self.product.id,
'date': timezone.now(),
'production': 5200
})
view = resolve('/sector/real/livestock/create')
self.assertTrue(login)
self.assertEqual(response.status_code, 200)
self.assertTemplateUsed(response, 'real/livestock/livestock_form.html')
self.assertContains(response, 'Livestock')
self.assertNotContains(response, 'Sugar')
self.assertEqual(
view.func.__name__,
views.LivestockCreateView.as_view().__name__
)
traceback
D:\MOF\Projects\guyanaeconomicsectoranalysis>docker-compose exec web python manage.py test real
Creating test database for alias 'default'...
System check identified no issues (0 silenced).
.E............
======================================================================
ERROR: test_livestock_create_view_user_is_login_and_have_permission
(real.tests.tests_livestock.LivestockTests)
----------------------------------------------------------------------
Traceback (most recent call last):
File "/Projects/real/tests/tests_livestock.py", line 875, in
test_livestock_create_view_user_is_login_and_have_permission
'production': 5200
File "/usr/local/lib/python3.7/site-packages/django/test/client.py", line 543, in post
response = super().post(path, data=data, content_type=content_type, secure=secure, **extra)
File "/usr/local/lib/python3.7/site-packages/django/test/client.py", line 357, in post
secure=secure, **extra)
File "/usr/local/lib/python3.7/site-packages/django/test/client.py", line 422, in generic
return self.request(**r)
File "/usr/local/lib/python3.7/site-packages/django/test/client.py", line 503, in request
raise exc_value
File "/usr/local/lib/python3.7/site-packages/django/core/handlers/exception.py", line 34, in inner
response = get_response(request)
File "/usr/local/lib/python3.7/site-packages/django/core/handlers/base.py", line 115, in
_get_response
response = self.process_exception_by_middleware(e, request)
File "/usr/local/lib/python3.7/site-packages/django/core/handlers/base.py", line 113, in
_get_response
response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "/usr/local/lib/python3.7/site-packages/django/views/generic/base.py", line 71, in view
return self.dispatch(request, *args, **kwargs)
File "/usr/local/lib/python3.7/site-packages/django/contrib/auth/mixins.py", line 52, in dispatch
return super().dispatch(request, *args, **kwargs)
File "/usr/local/lib/python3.7/site-packages/django/contrib/auth/mixins.py", line 85, in dispatch
return super().dispatch(request, *args, **kwargs)
File "/usr/local/lib/python3.7/site-packages/django/views/generic/base.py", line 97, in dispatch
return handler(request, *args, **kwargs)
File "/usr/local/lib/python3.7/site-packages/django/views/generic/edit.py", line 172, in post
return super().post(request, *args, **kwargs)
File "/usr/local/lib/python3.7/site-packages/django/views/generic/edit.py", line 141, in post
if form.is_valid():
File "/usr/local/lib/python3.7/site-packages/django/forms/forms.py", line 185, in is_valid
return self.is_bound and not self.errors
File "/usr/local/lib/python3.7/site-packages/django/forms/forms.py", line 180, in errors
self.full_clean()
File "/usr/local/lib/python3.7/site-packages/django/forms/forms.py", line 382, in full_clean
self._clean_form()
File "/usr/local/lib/python3.7/site-packages/django/forms/forms.py", line 409, in _clean_form
cleaned_data = self.clean()
File "/Projects/real/forms.py", line 140, in clean
self.cleaned_data['date'] = self.cleaned_data['date'].replace(day=1)
KeyError: 'date'
----------------------------------------------------------------------
Ran 14 tests in 0.791s
FAILED (errors=1)
Destroying test database for alias 'default'...
Код подтверждения, работающий в браузере