Django ModalForm показывает ошибку проверки в модальной форме начальной загрузки

Я не мог показать ошибки проверки django в моей модальной форме начальной загрузки. Мне нужно, чтобы поле client_phone на форме было не менее 13 символов, если нет - показать ошибку и выделить поле. Джанго — 1.10, Bootstrap 3

Вот код:

Модель:

class Order(models.Model):
    order_date = models.DateTimeField(auto_now_add=True, blank=True)
    client_phone = models.CharField(max_length=18)
    client_email = models.EmailField(max_length=50)

затем МодельФорма:

class OfferForm(ModelForm):
    class Meta:
        model = Order
        fields = ['client_phone', 'client_email']
        widgets = {
            'client_phone': TextInput(attrs={'class': 'form-control bfh-phone', 'data-country': 'UA', }),
        }
        labels = {
            'client_phone': _('Контактный номер'),
        }

Шаблон с загрузочной модальной формой:

<div class="modal fade" id="offerModalForm" tabindex="-1" role="dialog"
             aria-labelledby="myModalLabel" aria-hidden="true">
            <div class="modal-dialog">
                <div class="modal-content">
                    <div class="modal-body">
                        <form role="form" action="ordercomplete" method="post" enctype="multipart/form-data">
                            {% csrf_token %}
                            {{ form }}
                            <div class="modal-footer">
                                <button type="submit" id="offerSubmitBtn" class="btn btn-primary" type="submit">
                                    Оформить заказ
                                </button>
                                <button type="button" class="btn btn-primary"
                                        data-dismiss="modal">
                                    Закрыть
                                </button>
                            </div>

                        </form>
                    </div>
                </div>
            </div>
        </div>

Если я сделаю так:

def clean_client_phone(self):
        phone = self.cleaned_data.get('client_phone')
        if len(phone) < 13:
            raise forms.ValidationError(_('Invalid value'), code='invalid')
        return phone

Затем form.isValid() становится False, и ничего не происходит.

Также вот мой взгляд:

def ordercomplete(request):
    if request.method == 'POST':
        form = OfferForm(request.POST, request.FILES)
        if form.is_valid():
            order = form.save()
            date = order.order_date.strftime('%d-%m-%Y %H:%M')
            phone = form.cleaned_data['client_phone']
        return render(request, 'viveska/ordercomplete.html')
    else:
        return render(request, 'viveska/ordercomplete.html')

Модальное окно html является частью моей главной страницы, где я называю его нажатием кнопки:

<button type="button" class="btn btn-lg make_order_btn" data-toggle="modal"
                            data-target="#offerModalForm">Оформить заказ
                    </button>

Обновление 1:

Я отредактировал представление заказа следующим образом:

def ordercomplete(request):
    args = {}
    if request.method == 'POST':
        form = OfferForm(request.POST, request.FILES)
        logger.error(form.is_valid())
        if form.is_valid():
            order = form.save()
            return render(request, 'viveska/ordercomplete.html')
    else:
        form = OfferForm()
    phone_list = list(Phones.objects.all())
    logger.error(form.is_bound)
    args['form'] = form
    args['phone_list'] = phone_list
    return render(request, 'viveska/index.html', args)

и теперь он показывает мне ошибки поля, но каждый раз, когда какое-то значение недействительно, он скрывает форму, потому что она модальная. Как я могу сохранить его на экране после отправки с недопустимыми значениями?


person Aleksandr A    schedule 26.01.2017    source источник
comment
является ли HTML страницей ordercomplete? Вы никогда не передаете форму в контекст, поэтому я не уверен, как форма вообще отображается   -  person Sayse    schedule 26.01.2017
comment
нет, html является частью моей главной страницы, где я показываю модальное окно с помощью: html только сказал, что заказ выполняется хорошо. Я обновил вопрос.   -  person Aleksandr A    schedule 26.01.2017
comment
В основном вы используете {% if form.errors %} // ваша модальная логика начальной загрузки здесь{% endif %} см. этот вопрос stackoverflow.com/questions/22470637/   -  person bhaskarc    schedule 26.01.2017
comment
вы пропустили еще одно условие для form.is_valid   -  person RL Shyam    schedule 26.01.2017
comment
Предложение @tao помогает, спасибо :) но мне нужно еще одно предложение - см. вопрос Обновление 1.   -  person Aleksandr A    schedule 26.01.2017


Ответы (2)


Вы прошли 90% пути.

Вид:

    form_error = False
    if form.is_valid():
        order = form.save()
        date = order.order_date.strftime('%d-%m-%Y %H:%M')
        phone = form.cleaned_data['client_phone']
    else:
        form_error = True

Шаблон:

    {% if form_error %}
        $(#offerModalForm).modal("show");
    {% endif %}

Это покажет модальную форму пользователю, если произошла ошибка.

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

Самое большое преимущество проверки формы в самих формах, которое я вижу, заключается в том, что вы можете иметь очень последовательную проверку везде, где используется форма, без изменения или добавления какого-либо дополнительного кода.

person Archetype90    schedule 01.12.2017
comment
Да, главный недостаток этого метода в том, что форма будет перезагружена. Я согласен, что проверка формы действительно крутая :) - person Aleksandr A; 03.12.2017

Наконец, я сделал модальную проверку формы с помощью JavaScript. Спасибо за ответы.

person Aleksandr A    schedule 14.02.2017
comment
можете поделиться решением. Мне нужна помощь. - person sandeep; 24.02.2020
comment
Покажи тогда решение. Сказать, что ты нашел это, недостаточно. - person Guillermo Brachetta; 23.05.2020