Форма.ошибки, не отображаемые в TemplateView

#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 в контексте… Не говоря уже о том, что ошибки формы не будут отображаться, даже сама форма не будет отображаться (на самом деле нужно открыть страницу и посмотреть, а не просто запускать тест)