UpdateView form_valid не перенаправляет, как ожидалось - продолжает говорить form_valid?
У меня есть Django UpdateView
, который я пытаюсь протестировать. UpdateView
только принимает запросы на почту, обрабатывает форму и перенаправляет пользователя соответствующим образом в зависимости от того, как прошла отправка формы.
Тест не работает, но если я запускаю локальный сервер, он работает, как я и ожидал. Я не уверен, является ли это признаком того, что мой тест настроен неправильно - или тест раскрывает какую-то странную ошибку.
Мое представление выглядит следующим образом:
class TressleUpdateView(UpdateView):
http_method_names = ["post"]
form_class = TressleForm
model = Tressle
pk_url_kwarg = "tressle_id"
raise_exception = True
def form_valid(self, form):
"""
This method is called when valid form data has been POSTed. We set the
updated_by to the requestor to know who updated this.
"""
# Ensure the tressle is at a point to be finalized
# If not, add a message informing the user that the tressle is not
# complete, and redirect to the summary detail page.
if form.instance.progress() < 100:
messages.error(
self.request,
_(
"The tressle is not complete. Please ensure that all "
"requirements have been met."
),
)
return redirect(
reverse_lazy(
"myapp:tressle-detail",
kwargs={
"tressle_id": self.kwargs["tressle_id"],
},
)
)
# Get the requestor Person object
request_person = get_object_or_404(
Person, id=self.request.user.person_id
)
# Set the updated_by user
form.instance.updated_by = request_person
messages.success(
self.request,
_("The tressle has been finalized and is no longer editable."),
)
return super().form_valid(form)
def get_success_url(self, **kwargs):
return reverse_lazy(
"myapp:tressle-detail",
kwargs={
"tressle_id": self.kwargs["tressle_id"],
},
)
Мой тест выглядит следующим образом:
def test_view_redirects_if_tressle_incomplete(self):
"""
Test that the view redirects to the tressle detail page
with the appropriate message if the
tressle is incomplete.
"""
self.client.force_login(self.app_user)
response = self.client.post(
self.incomplete_tressle_update_url,
data={
"finalized": True,
"rubric": self.incomplete_tressle.rubric.id,
},
follow=True,
)
messages = list(response.context["messages"])
self.assertEqual(len(messages), 1)
self.assertEqual(
messages[0].message,
"The tressle has been finalized and is no longer editable.",
)
self.assertRedirects(
response,
reverse_lazy(
"myapp:tressle-detail",
kwargs={
"tressle_id": self.tressle_person.id,
},
),
)
Обновляемый в тесте tressle
имеет progress()
значение 0.0 - и является "неполным", однако, когда тест выполняется, на выходе получается следующее:
AssertionError: 'The tressle is not complete. Please ensure that all r[22 chars]met.' != 'The tressle has been finalized and is no longer editable.'
Я зашел в отладчик в тесте и вижу, что он попадает на соответствующий редирект и получает сообщение об ошибке, но код не останавливается на этом и продолжает попадать на super().form_valid(form)
, но я не уверен почему.
Есть идеи?