πŸ” Как ΡƒΠ·Π½Π°Ρ‚ΡŒ ΠΏΠΎΡ‡Π΅ΠΌΡƒ Ρ„ΠΎΡ€ΠΌΠ° Π½Π΅ Π²Π°Π»ΠΈΠ΄Π½Π° Π² Django?

Π§Ρ‚ΠΎΠ±Ρ‹ ΡƒΠ·Π½Π°Ρ‚ΡŒ, ΠΏΠΎΡ‡Π΅ΠΌΡƒ Ρ„ΠΎΡ€ΠΌΠ° Π½Π΅ Π²Π°Π»ΠΈΠ΄Π½Π° Π² Django, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄ is_valid() для ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ валидности Ρ„ΠΎΡ€ΠΌΡ‹. Если Ρ„ΠΎΡ€ΠΌΠ° Π½Π΅ Π²Π°Π»ΠΈΠ΄Π½Π°, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ доступ ΠΊ ошибкам, Π²Ρ‹Π·Π²Π°Π² ΠΌΠ΅Ρ‚ΠΎΠ΄ errors. НиТС ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΊΠΎΠ΄Π°:

form = YourForm(request.POST)
if form.is_valid():
    # ДСйствия ΠΏΡ€ΠΈ Π²Π°Π»ΠΈΠ΄Π½ΠΎΠΉ Ρ„ΠΎΡ€ΠΌΠ΅
else:
    errors = form.errors
    # Π Π°Π±ΠΎΡ‚Π° с ошибками

Π”Π΅Ρ‚Π°Π»ΡŒΠ½Ρ‹ΠΉ ΠΎΡ‚Π²Π΅Ρ‚

Как ΡƒΠ·Π½Π°Ρ‚ΡŒ, ΠΏΠΎΡ‡Π΅ΠΌΡƒ Ρ„ΠΎΡ€ΠΌΠ° Π½Π΅ Π²Π°Π»ΠΈΠ΄Π½Π° Π² Django

Π’Π΅Π±-прилоТСния, Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Π°Π½Π½Ρ‹Π΅ с использованиСм Django, часто ΠΈΠΌΠ΅ΡŽΡ‚ Ρ„ΠΎΡ€ΠΌΡ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΠΈ Π·Π°ΠΏΠΎΠ»Π½ΡΡŽΡ‚ ΠΈ ΠΎΡ‚ΠΏΡ€Π°Π²Π»ΡΡŽΡ‚. Однако ΠΌΠΎΠΆΠ΅Ρ‚ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΡƒΡ‚ΡŒ ситуация, ΠΊΠΎΠ³Π΄Π° Ρ„ΠΎΡ€ΠΌΠ° Π½Π΅ Π²Π°Π»ΠΈΠ΄Π½Π°, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ Π½Π΅ соотвСтствуСт трСбованиям, установлСнным Π² вашСй ΠΌΠΎΠ΄Π΅Π»ΠΈ Ρ„ΠΎΡ€ΠΌΡ‹ Django.

1. ΠžΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ ошибок Π²Π°Π»ΠΈΠ΄Π°Ρ†ΠΈΠΈ Ρ„ΠΎΡ€ΠΌΡ‹

Когда Ρ„ΠΎΡ€ΠΌΠ° Π½Π΅ Π²Π°Π»ΠΈΠ΄Π½Π°, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ доступ ΠΊ ошибкам Π²Π°Π»ΠΈΠ΄Π°Ρ†ΠΈΠΈ ΠΈ ΠΎΡ‚ΠΎΠ±Ρ€Π°Π·ΠΈΡ‚ΡŒ ΠΈΡ… для ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ. Django прСдоставляСт ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ для получСния этих ошибок, ΠΈ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ ΠΈΡ… Π² вашСм HTML-шаблонС.

    
    # ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, Ρƒ вас Π΅ΡΡ‚ΡŒ Ρ„ΠΎΡ€ΠΌΠ° с ΠΈΠΌΠ΅Π½Π΅ΠΌ 'MyForm'
    from django.shortcuts import render

    def my_view(request):
        form = MyForm(request.POST)
        if form.is_valid():
            # Π›ΠΎΠ³ΠΈΠΊΠ° ΠΏΡ€ΠΈ Π²Π°Π»ΠΈΠ΄Π½ΠΎΠΉ Ρ„ΠΎΡ€ΠΌΠ΅
            # ...
            pass
        else:
            # ΠžΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ ошибок Π²Π°Π»ΠΈΠ΄Π°Ρ†ΠΈΠΈ
            errors = form.errors
            return render(request, 'my_template.html', {'form': form, 'errors': errors})
    
    

Π’ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΌ Π²Ρ‹ΡˆΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΌΡ‹ провСряСм, являСтся Π»ΠΈ Ρ„ΠΎΡ€ΠΌΠ° 'MyForm' Π²Π°Π»ΠΈΠ΄Π½ΠΎΠΉ. Если ΠΎΠ½Π° Π½Π΅ ΠΏΡ€ΠΎΡ…ΠΎΠ΄ΠΈΡ‚ Π²Π°Π»ΠΈΠ΄Π°Ρ†ΠΈΡŽ, ΠΌΡ‹ сохраняСм ошибки Π² ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ 'errors' ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Π΅ΠΌ ΠΈΡ… вмСстС с Ρ„ΠΎΡ€ΠΌΠΎΠΉ Π² наш HTML-шаблон 'my_template.html'.

2. ΠžΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ ошибок Π² шаблонС Django

Π§Ρ‚ΠΎΠ±Ρ‹ ΠΎΡ‚ΠΎΠ±Ρ€Π°Π·ΠΈΡ‚ΡŒ ошибки Π² HTML-шаблонС, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ†ΠΈΠΊΠ» 'for' ΠΈ ΠΎΠ±Ρ€Π°Ρ‰Π°Ρ‚ΡŒΡΡ ΠΊ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ошибкС ΠΏΠΎ Π΅Π΅ ΠΈΠΌΠ΅Π½ΠΈ поля.

    
    
    
{% csrf_token %} {{ form.as_p }} {% for field in form %} {% if field.errors %}
{{ field.errors }}
{% endif %} {% endfor %}

Π’Ρ‹Π²ΠΎΠ΄ ошибок происходит Π²Π½ΡƒΡ‚Ρ€ΠΈ Ρ†ΠΈΠΊΠ»Π° 'for', Π³Π΄Π΅ ΠΌΡ‹ провСряСм, Π΅ΡΡ‚ΡŒ Π»ΠΈ ошибки Ρƒ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ поля Ρ„ΠΎΡ€ΠΌΡ‹. Если Π΅ΡΡ‚ΡŒ, ΠΌΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ 'field.errors' для отобраТСния сообщСния ΠΎΠ± ошибкС Π² HTML-шаблонС.

3. Доступ ΠΊ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠΉ ошибкС Ρ„ΠΎΡ€ΠΌΡ‹

Иногда Π²Π°ΠΌ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠ½Π°Π΄ΠΎΠ±ΠΈΡ‚ΡŒΡΡ доступ ΠΊ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠΉ ошибкС Ρ„ΠΎΡ€ΠΌΡ‹. Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚ΡŒΡΡ ΠΊ Π½Π΅ΠΉ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ имя поля ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄ 'as_data()' ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° 'form.errors'.

    
    def my_view(request):
        form = MyForm(request.POST)
        if form.is_valid():
            # Π›ΠΎΠ³ΠΈΠΊΠ° ΠΏΡ€ΠΈ Π²Π°Π»ΠΈΠ΄Π½ΠΎΠΉ Ρ„ΠΎΡ€ΠΌΠ΅
            # ...
            pass
        else:
            # Доступ ΠΊ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠΉ ошибкС Ρ„ΠΎΡ€ΠΌΡ‹
            error_message = form.errors.as_data()['field_name'][0].message
            return render(request, 'my_template.html', {'form': form, 'error_message': error_message})
    
    

Π’ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Π²Ρ‹ΡˆΠ΅ ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ доступ ΠΊ ошибкС ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠ³ΠΎ поля с ΠΈΠΌΠ΅Π½Π΅ΠΌ 'field_name' с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° 'as_data()'. Π—Π°Ρ‚Π΅ΠΌ ΠΌΡ‹ ΠΈΠ·Π²Π»Π΅ΠΊΠ°Π΅ΠΌ сообщСниС ΠΎΠ± ошибкС с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ 'message'.

4. ΠŸΠ΅Ρ€ΡΠΎΠ½Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡ сообщСний ΠΎΠ± ΠΎΡˆΠΈΠ±ΠΊΠ°Ρ…

Django позволяСт ΠΏΠ΅Ρ€ΡΠΎΠ½Π°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ сообщСния ΠΎΠ± ΠΎΡˆΠΈΠ±ΠΊΠ°Ρ… для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ поля Ρ„ΠΎΡ€ΠΌΡ‹. Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ 'error_messages' Π² вашСм классС Ρ„ΠΎΡ€ΠΌΡ‹ ΠΈ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ свои сообщСния.

    
    from django import forms

    class MyForm(forms.Form):
        field_name = forms.CharField(
            error_messages={
                'required': 'Π­Ρ‚ΠΎ ΠΏΠΎΠ»Π΅ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ для заполнСния.',
                'invalid': 'НСвСрный Ρ„ΠΎΡ€ΠΌΠ°Ρ‚.',
            }
        )
    
    

Π’ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΌ Π²Ρ‹ΡˆΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΌΡ‹ пСрсонализируСм сообщСния ΠΎΠ± ошибкС для поля 'field_name'. ΠœΡ‹ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅ΠΌ Π΄Π²Π° сообщСния: 'required' для ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ поля ΠΈ 'invalid' для Π½Π΅Π²Π΅Ρ€Π½ΠΎΠ³ΠΎ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π°.

5. ИспользованиС Ρ„ΠΎΡ€ΠΌΡ‹ с ΠΊΠ½ΠΎΠΏΠΊΠΎΠΉ 'submit'

Когда Π²Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ Ρ„ΠΎΡ€ΠΌΡƒ с ΠΊΠ½ΠΎΠΏΠΊΠΎΠΉ 'submit', Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ 'formnovalidate' для ΠΎΡ‚ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ встроСнной Π²Π°Π»ΠΈΠ΄Π°Ρ†ΠΈΠΈ Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π°. Он позволяСт Π²Π°ΠΌ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ Π²Π°Π»ΠΈΠ΄Π°Ρ†ΠΈΡŽ Ρ„ΠΎΡ€ΠΌΡ‹ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π½Π° сСрвСрной сторонС.

    
    
    
{% csrf_token %} {{ form.as_p }}

Π’ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΌ Π²Ρ‹ΡˆΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΌΡ‹ добавляСм Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ 'formnovalidate' ΠΊ ΠΊΠ½ΠΎΠΏΠΊΠ΅ 'submit', Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΡ‚ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ Π²ΡΡ‚Ρ€ΠΎΠ΅Π½Π½ΡƒΡŽ Π²Π°Π»ΠΈΠ΄Π°Ρ†ΠΈΡŽ Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π°. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Ρ„ΠΎΡ€ΠΌΠ° Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΡ‚ΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒΡΡ Π½Π° сСрвСр Π±Π΅Π· выполнСния Π²Π°Π»ΠΈΠ΄Π°Ρ†ΠΈΠΈ Π½Π° клиСнтской сторонС.

Π—Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅

Π’ этой ΡΡ‚Π°Ρ‚ΡŒΠ΅ Π±Ρ‹Π»ΠΎ рассказано, ΠΊΠ°ΠΊ ΡƒΠ·Π½Π°Ρ‚ΡŒ, ΠΏΠΎΡ‡Π΅ΠΌΡƒ Ρ„ΠΎΡ€ΠΌΠ° Π½Π΅ Π²Π°Π»ΠΈΠ΄Π½Π° Π² Django. ΠœΡ‹ рассмотрСли способы отобраТСния ошибок Π²Π°Π»ΠΈΠ΄Π°Ρ†ΠΈΠΈ Ρ„ΠΎΡ€ΠΌΡ‹, доступа ΠΊ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹ΠΌ ошибкам, пСрсонализации сообщСний ΠΎΠ± ΠΎΡˆΠΈΠ±ΠΊΠ°Ρ… ΠΈ использования Ρ„ΠΎΡ€ΠΌΡ‹ Π±Π΅Π· встроСнной Π²Π°Π»ΠΈΠ΄Π°Ρ†ΠΈΠΈ Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π°. Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π±ΠΎΠ»Π΅Π΅ эффСктивно ΡƒΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ ΠΈ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ ΠΎ Π½Π΅Π²Π°Π»ΠΈΠ΄Π½Ρ‹Ρ… Ρ„ΠΎΡ€ΠΌΠ°Ρ… Π² вашСм Π²Π΅Π±-ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ Django.

Π’ΠΈΠ΄Π΅ΠΎ ΠΏΠΎ Ρ‚Π΅ΠΌΠ΅

#13. ИспользованиС Ρ„ΠΎΡ€ΠΌ, Π½Π΅ связанных с модСлями | Django ΡƒΡ€ΠΎΠΊΠΈ

5.12 Π€ΠΎΡ€ΠΌΡ‹ Π² Django GET POST запросы

#44. ИспользованиС Ρ„ΠΎΡ€ΠΌ Π½Π΅ связанных с модСлями | Π£Ρ€ΠΎΠΊΠΈ ΠΏΠΎ Django 4

ΠŸΠΎΡ…ΠΎΠΆΠΈΠ΅ ΡΡ‚Π°Ρ‚ΡŒΠΈ:

Как ΡΠΊΠ°Ρ‡Π°Ρ‚ΡŒ Django PyCharm: процСсс пошагово

πŸ” Как ΡƒΠ·Π½Π°Ρ‚ΡŒ ΠΏΠΎΡ‡Π΅ΠΌΡƒ Ρ„ΠΎΡ€ΠΌΠ° Π½Π΅ Π²Π°Π»ΠΈΠ΄Π½Π° Π² Django?