Проблема с тестированием UpdateView в Django

У меня есть UpdateView, который позволяет редактировать объекты модели Scooter. После успешной обработки формы (через POST-запрос) представление должно перенаправить пользователя на страницу подробностей редактируемого скутера (с кодом состояния 302). Однако в моем тесте я вижу, что ответ после POST-запроса возвращает код состояния 200, а response.context содержит данные объекта, как будто форма была переоткрыта, а не произошел редирект.

Почему UpdateView возвращает код состояния 200 после POST-запроса, хотя метод get_success_url настроен правильно? Является ли использование response.context после POST уместным в таком тесте? Следует ли вместо этого использовать refresh_from_db для объекта в базе данных? Есть ли лучший способ протестировать поведение UpdateView в Django, чтобы избежать потенциальных несоответствий с поведением представления после POST-запроса?

(они находятся в разных файлах, конечно, мне просто нужно было вставить их сюда)

@pytest.mark.django_db
def test_scooter_detail_edit_data(client, superuser_user, available_scooter):
    url = reverse('scooter-update', kwargs={'scooter_id': available_scooter.id})
    client.force_login(superuser_user)
    response = client.get(url)
    assert response.status_code == 200
    assert response.context['scooter'].available == True
    assert response.context['scooter'].daily_price == 100
    response = client.post(url, data={
        'available': False,
        'daily_price': 200,
    })
    assert response.status_code == 200
    assert response.context['scooter'].available == False
    assert response.context['scooter'].daily_price == 200


class ScooterUpdateView(UpdateView):
    model = Scooter
    template_name = 'scooters/scooter_edit.html'
    pk_url_kwarg = 'scooter_id'
    fields = [
        'available',
        'image',
        'daily_price',
        'weekly_price',
        'monthly_price',
        'deposit_amount',
    ]

    def get_queryset(self):
        if self.request.user.is_superuser:
            return Scooter.objects.all()
        raise Http404

    def get_success_url(self):
        return reverse_lazy('scooter-detail', kwargs={'scooter_id': self.object.pk})


@fixture
def available_scooter():
    scooter = Scooter.objects.create(
        brand="Yamaha",
        scooter_model="XMax 300",
        capacity=300,
        year=2022,
        registration_number="KR12345",
        available=True,
        image=None,
        daily_price=100,
        weekly_price=600,
        monthly_price=2000,
        deposit_amount=500,
    )
    return scooter

tests/tests.py::test_scooter_detail_edit_data PASSED

Почему UpdateView возвращает код состояния 200 после POST-запроса, хотя метод get_success_url настроен правильно?

Потому что POST-запрос не является успешным. Действительно, если данные, которые вы отправляете в форму, недействительны, и форма, таким образом, отклоняет их, UpdateView отобразит шаблон с формой, а также форму, показывающую ошибки.

Здесь похоже, что данные отсутствуют, некоторые поля могут быть обязательными, и поэтому форма, вероятно, отклоняет данные.

Вернуться на верх