TypeError: get() missing 1 required positional argument: 'id'; RequestFactory
Я тестирую представление UserProfilePage
с объектом имитации запроса с помощью RequestFactory
. При вызове обработчика GET
возникает ошибка, говорящая, что отсутствует позиционный аргумент. Однако в запросе нет позиционных аргументов. Что может вызвать эту ошибку?
Traceback (most recent call last):
File "C:\..\site-packages\django\test\testcases.py", line 1201, in setUpClass
cls.setUpTestData()
File "C:\..\authors\test\test_views.py", line 110, in setUpTestData
request = RequestFactory().get(reverse("authors:profile", kwargs={'id': 1}))
File "C:\..\site-packages\django\views\generic\base.py", line 70, in view
return self.dispatch(request, *args, **kwargs)
File "C:\..\site-packages\django\views\generic\base.py", line 98, in dispatch
return handler(request, *args, **kwargs)
TypeError: get() missing 1 required positional argument: 'id'
class TestViewUserQuestionsPostedPage(TestCase):
@classmethod
def setUpTestData(cls):
cls.user = get_user_model().objects.create_user("ItsMe")
viewer = get_user_model().objects.create_user("ItsYou")
request = RequestFactory().get(reverse("authors:profile", kwargs={'id': 1}))
cls.view = UserProfilePage.as_view()(request).view_class
cls.view_context = cls.view.get_context_data()
def test_viewed_profile_of_user(self):
self.assertIsInstance(self.view, Page)
self.assertIn('user', self.view_context)
self.assertEqual(self.view_context['object'], self.user)
class Page(TemplateView):
def get_context_data(self, **kwargs):
context = super().get_context_data()
context['search_form'] = SearchForm()
return context
class UserProfilePage(Page, SingleObjectMixin):
model = get_user_model()
pk_url_kwarg = "id"
def get(self, request, id):
return HttpResponse("Hi")
authors_patterns = ([
path("<id>", av.UserProfilePage.as_view(), name="profile")
], "authors")
urlpatterns = [
path("users/", include(authors_patterns, namespace="authors"))
]
В пути authors_patterns у вас указано <id>
. Вы не указали, что id должен быть int, например <int:id>
В обратном направлении вы передаете kwarg, который является int.
kwargs={'id': 1}
В docs указано, что:
Захваченные значения могут опционально включать тип конвертера. Например, используйте
<int:name>
для захвата целочисленного параметра. Если конвертер не указан если конвертер не указан, то будет сопоставлена любая строка, за исключением символа /.
Может быть, из-за того, что вы не передаете строку, она не сопоставляется?
Попробуйте указать ваш url как <int:id>
или ваш kwarg как kwargs={'id': '1'}
и посмотрите, решит ли это вашу проблему.