Пользовательский валидатор форм Django не выводит ошибку валидации на фронтенд

У меня есть пользовательский валидатор, который должен выдавать ошибку на фронтенде для пользователя, если валидация не прошла. Однако, я не уверен, где и как вернуть это на фронтенд. Сейчас это отображается только в терминале/на сайте ошибок Django на dev-сервере:

Вид:

def raise_poller(request):
    # if this is a POST request we need to process the form data
    if request.method == 'POST':

        # create a form instance and populate it with data from the request:
        form = PollersForm(request.POST)

        # check whether it's valid:
        if form.is_valid():

            # Make Validation of Choices Fields
            poller_choice_one = form.cleaned_data['poller_choice_one']
            poller_choice_two = form.cleaned_data['poller_choice_two']

            if ' ' in poller_choice_one or ' ' in poller_choice_two:
                raise ValidationError('Limit your choice to one word', code='invalid')

                return poller_choice_two  # !! IDE says this is unreachable

            else:

                # process the remaining data in form.cleaned_data as required

                poller_nature = form.cleaned_data['poller_nature']
                poller_text = form.cleaned_data['poller_text']
                poller_categories = form.cleaned_data['poller_categories']

                # Get the user
                created_by = request.user

                # Save the poller to the database
                p = Pollers(poller_nature=poller_nature,
                            poller_text=poller_text,
                            poller_choice_one=poller_choice_one,
                            poller_choice_two=poller_choice_two,
                            created_by=created_by)
                p.save()
                p.poller_categories.set(poller_categories)

                # redirect to a new URL:
                return HttpResponseRedirect('/')

    # if a GET (or any other method) we'll create a blank form
    else:
        form = PollersForm()

    return render(request, 'pollinator/raise_poller.html', {'form': form})

шаблон

{% block content %}

    <div class="poll-container">

        <form action="/raisepoller/" method="post">
            {% csrf_token %}
            {{ form }}
            <input type="submit" value="Submit">
        </form>
    </div>
    
{% endblock %}

А также где лучше всего структурировать/реализовать пользовательские валидаторы? После части if form.is_valid?

Чтобы показать ошибку в форме, вы должны поднять ValidationError в форме (а не в представлении), потому что форма ожидает и обрабатывает, когда ValidationError в конечном итоге будет поднята. Прочитайте документацию о валидации форм здесь

class PollersForm(forms.Form):
  
    def clean(self):
       data = self.cleaned_data
       poller_choice_one = data['poller_choice_one']
       poller_choice_two = data['poller_choice_two']

       if ' ' in poller_choice_one or ' ' in poller_choice_two:
           # raising ValidationError here in clean does the trick
           raise ValidationError('Limit your choice to one word', code='invalid')
       return data

sidenote: если единственное, что вы делаете с формой, это создаете экземпляр модели, вам следует рассмотреть возможность использования ModelForm вместо нее, которая предназначена именно для этой цели. Это избавит вас от написания большого количества кода.

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