@YuriyCherniy

Почему reverse ведёт себя странно при тестировании View с POST запросом?

Вот тестируемая вьюха:
class MainPageEditorCreate(LoginRequiredMixin, View):
    raise_exception = True

    def get(self, request):
        if ItemOnMainPage.objects.count() == 9:
            messages.warning(
                request, 'Нельзя добавить на главную больше 9 товаров'
            )
            return redirect('main_page_editor_url')

        form = ItemOnMainPageCreateForm()
        return render(
            request, 'mainpage/item_on_main_page_form.html', {'form': form}
        )

    def post(self, request):
        form = ItemOnMainPageCreateForm(request.POST)
        if form.is_valid():
            try:
                ItemOnMainPage.objects.create(
                    item_on_main_page=form.cleaned_data['item_on_main_page'],
                    position=ItemOnMainPage.objects.count() + 1
                )
                messages.success(request, 'Товар успешно добавлен на главную')
                return redirect('main_page_editor_url')
            except IntegrityError:
                messages.warning(request, 'Этот товар уже есть на главной')
                return redirect('main_page_editor_url')
        else:
            messages.warning(request, 'Что-то пошло не так!')
            return redirect(request, '/')

Вот мой нерабочий тест:
def test_main_page_editor_create_view_status_code_200_POST(self):
        self.c.post(
            '/admin/login/', {'username': 'test', 'password': '0000'}
        )
        response = self.c.post(
            reverse('add_item_to_main_page_url'),
            {'item_on_main_page_id': 1}
        )
        self.assertEquals(response.status_code, 200)

Вот так ругается Django:
'<WSGIRequest: POST '/main-page-editor/add-item/'>' not found. '<WSGIRequest: POST '/main-page-editor/add-item/'>' is not a valid view function or pattern name.

Почему reverse возвращает url такого странного вида: '/main-page-editor/add-item/'>' Что за знак больше в конце, из-за которого проваливается тест? При тесте GET запроса такого не происходит, url возвращается без лишних знаков.
На всякий случай вот мой urlpatterns:
urlpatterns = [
    path('', MainPageEditorList.as_view(), name='main_page_editor_url'),
    path('<int:pk>/delete/', MainPageEditorDelete.as_view(), name='delete_item_from_main_page_url'),
    path('<int:pk>/update/', MainPageEditorUpdate.as_view(), name='update_item_on_main_page_url'),
    path('add-item/', MainPageEditorCreate.as_view(), name='add_item_to_main_page_url')
]

Скажите куда копать? Не могу понять во, что уперся.
  • Вопрос задан
  • 113 просмотров
Пригласить эксперта
Ответы на вопрос 1
@noremorse_ru
Срабатывает инвалид и возвращается return redirect(request, '/')
request тут лишний
Вообще конечно проще было бы взять готовый класс FormView, а messages передавать ошибки с форм, код будет чище и понятнее
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы