#python #django
Вопрос:
При отправке формы желаемым результатом является отображение сообщений об ошибках проверки в шаблоне, если форма недействительна. Когда дело доходит до того, что я на самом деле получаю, в шаблоне вообще не отображается никаких сообщений об ошибках, хотя форма действительно улавливает ошибки.
Я пытаюсь получить желаемый результат, используя только TemplateView.
class TestUserRegisterPage(TestCase):
'''Verify that a message is flashed when attempting to
create a new account with a username already taken.'''
@classmethod
def setUpTestData(cls):
user = User.objects.create_user("Mock")
cls.payload = {
"username": "Mock",
"password1": "secret",
"password2": "secret"
}
def test_new_user_registeration_fail(self):
response = self.client.post(
reverse("users:register"),
data=self.payload
)
self.assertEqual(response.status_code, 200)
print(response.content)
self.assertTemplateUsed(response, "users/register.html")
self.assertContains(response, "A user with that username already exists")
AssertionError: False is not true : Couldn't find 'A user with that username already exists' in response
-> form = self.get_context_data()['register_form'](payload)
(Pdb) n
> usersviews.py(30)post()
-> if form.is_valid():
(Pdb) form.errors
{'username': ['A user with that username already exists.'], 'password2': ['This password is too short. It must contain at least 8 characters.', 'This password is too common.']}
(Pdb)
class UserRegisterPage(TemplateView):
template_name = "users/register.html"
def get_context_data(self):
context = super().get_context_data()
context['register_form'] = NewUserForm
return context
def get(self, request):
context = self.get_context_data()
context['register_form'] = context['register_form']()
return self.render_to_response(context)
def post(self, request):
payload = request.POST
form = self.get_context_data()['register_form'](payload)
if form.is_valid():
messages.add_message(
request, messages.INFO,
"Your account is registered...now you may login!"
)
return HTTPRedirectResponse(reverse("topics:listing"))
context = self.get_context_data()
context['register_form'] = form
return self.render_to_response(context)
{% block content %}
<form action="{% url 'users:register' %}" method="POST">
{% if form.errors %}
<ul>
{% for error in form.errors.values %}
<li>{{ error }}</li>
{% endfor %}
</ul>
{% endif %}
{% for field in form %}
{{ field }}
{% endfor %}
<button type="submit">Register</button>
</form>
{% endblock %}
Комментарии:
1. Эти
self.assertXxx
функции предназначены для прерывания работы сервера в случае плохих условий. Они не предназначены для проверки ответов на формы. Если вы хотите проверить поля и вернуть ошибки, вам придется сделать это самостоятельно.2. В шаблоне вы ссылаетесь на форму как
form
на, но в представлении вы передали ее какregister_form
в контексте… Не говоря уже о том, что ошибки формы не будут отображаться, даже сама форма не будет отображаться (на самом деле нужно открыть страницу и посмотреть, а не просто запускать тест)