Как проверить модальную форму на наличие ошибок и показать их в той же модальной форме? - PullRequest
0 голосов
/ 22 сентября 2019

У меня есть форма django для создания / обновления записей, которые отображаются на модале начальной загрузки (запущенном через скрипт JQuery), я могу создавать записи, но когда я ввожу информацию, которая уже существует в de DDBB, я получаю ошибку:

"django.db.utils.IntegrityError: двойное значение ключа нарушает ограничение уникальности. ПОДРОБНЕЕ: Ключ (descripcion) = (OC) уже существует."

Я понимаю, что ошибка вызвана тем, чтоЯ установил свойство поля в модели как уникальное.

Я попытался переопределить метод clean () в форме, чтобы перехватывать ошибки, которые работают частично, теперь я не получаю ошибку целостностисообщение, но я получаю чистую форму в результате, но не в модальном, в его случае показано так:

форма

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

Я очень нуб на JQuery иd любая идея или руководство будут очень полезны.

Заранее спасибо.

Для справки код, который я имею до сих пор:

Модель:

class Categoria(models.Model):
    descripcion = models.CharField(
        max_length=100,
        help_text='Descripción de la categoría',
        unique=True,
    )

    def __str__(self):
        return '{}'.format(self.descripcion)

    def save(self):
        self.descripcion=self.descripcion.upper()
        super(Categoria, self).save()

    class Meta:
        verbose_name_plural="Categorias"

Просмотров:

class CategoriaNew(generic.CreateView):
    model=Categoria
    template_name = 'catalogos/categoria_form.html'
    context_object_name = 'obj'
    form_class = CategoriaForm
    success_url = reverse_lazy('catalogos:categoria_list') 
    login_url = 'base:login'

    def form_valid(self, form):
        form.instance.uc = self.request.user 
        return super().form_valid(form) 

class CategoriaEdit(generic.UpdateView):
    model=Categoria
    template_name = 'catalogos/categoria_form.html'
    context_object_name = 'obj' 
    form_class = CategoriaForm 
    success_url = reverse_lazy('catalogos:categoria_list')
    login_url = 'bases:login' 

    def form_valid(self, form):
        form.instance.um = self.request.user.id 
        return super().form_valid(form)

URL:

path('categoria/new', CategoriaNew.as_view(), name="categoria_new"),
path('categoria/edit/<int:pk>', CategoriaEdit.as_view(), name="categoria_edit"),

Форма:

class CategoriaForm(forms.ModelForm):
    class Meta:
        model = Categoria
        fields = ['descripcion', 'estado']
        labels = {'descripcion':"Descripción de la categoría",
                    'estado':"Estado"}
        widget = {'descripcion' : forms.TextInput()}

    def clean(self):
        try:
            sc = Categoria.objects.get(
                descripcion=self.cleaned_data['descripcion'].upper()
            )
            if not self.instance.pk:
                raise forms.ValidationError(
                    "Ya existe una categoria con esta descripción")
            elif self.instance.pk:
                raise forms.ValidationError(
                    "Error en la edición, los valores ya existen")
        except Categoria.DoesNotExist:
            pass
        return self.cleaned_data 

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        for field in iter(self.fields):
            self.fields[field].widget.attrs.update({
                'class':'form-control'
            })

HTML-шаблон формы:

{% load static %} <div class="modal-dialog modal-lg">
    <div class="modal-content">
        {% if obj %}
        <form method="POST" role="form" class="form-inline" action="{% url 'catalogos:categoria_edit' obj.pk %}">
            {% else %}
            <form method="POST" role="form" class="form-inline" action="{% url 'catalogos:categoria_new'%}">
                {% endif %}
                {% csrf_token %}
                <div class="col-xl-12 col-md-12 mb-12">
                    {% if obj %}
                    <!--Si al cargar el formulario de creación/edición ya hay datos-->
                    <div class="card border-left-warning shadow h-100 py-2">
                        <!--se mostrará un borde de color amarillo-->
                        {% else %}
                        <!--Si al cargar el formulario de creación/edición No hay datos-->
                        <div class="card border-left-success shadow h-100 py-2">
                            <!--se mostrará un borde de color verde-->
                            {% endif %}
                            <div class="card-body">
                                <div class="row no-gutters align-items-center">
                                    <div class="col mr-2">
                                        <div class="text-xs font-weight-bold text-primary text-uppercase mb-1">
                                            {% if obj %} Editar {% else %} Nueva {% endif %} Categoría
                                            <!--De manera similar cambiamos el encabezado del formulario-->
                                        </div>
                                        <div class="dropdown-divider"></div>
                                        <div class="row justify-content-center">

                                            <div class="form-group col-md-7">
                                                <label for="id_descripcion">Descripción </label>
                                                <div class="form-group col-md-1"></div>
                                                <input type="text" name="descripcion" maxlength="100"
                                                    class="form-control" required id="id_descripcion"
                                                    placeholder="Ejem. 'Mi categoria'"
                                                    value="{% if obj %} {{obj.descripcion}} {% endif %}">
                                                    <div><br><br><br><br></div>

                                                <div class="form-check">
                                                    <label class="form-check-label"
                                                        for="id_estado">Estado de cat.</label>
                                                    <div class="form-group col-md-1"></div>
                                                    <input class="form-control" type="checkbox" name="estado"
                                                        id="id_estado" 
                                                        data-toggle="toggle"
                                                        data-style="fast"                                                     

                                                        {% if obj.estado %} checked {% endif %}>
                                                </div>
                                            </div>


                                            <!-- {{ form.as_p }} -->
                                        </div>
                                        <div class="form-text text-danger" id="form-error"></div>
                                        <div class="dropdown-divider"></div>
                                        <div class="row text-center">
                                            <div class="col">
                                                <a href="{% url 'catalogos:categoria_list' %}"
                                                    class="btn btn-danger"><span class="fad fa-undo"></span> Cancelar</a>
                                                <button type="submit" class="btn btn-primary"><span
                                                class="fad fa-upload"></span> Guardar</button>
                                            </div>
                                        </div>
                                    </div>
                                </div>
                            </div>
                        </div>
                    </div>
            </form>
    </div> </div> 

Функция для открытия и закрытия модального режима:

function abrir_modal(url) {
    $("#popup").load(url, function () {
        $(this).modal({
            backdrop: 'static',
            keyboard: false 
        })
        $(this).modal('show'); /*Mostramos el modal*/
    });
    return false; }

function cerrar_modal() {
    $('#popup').modal('hide'); /*Cerramos el modal*/
    return false; }

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

    <a class="btn btn-primary" href="#" onclick="return abrir_modal('{% url 'catalogos:categoria_new' %}')"><i class="fad fa-plus-circle fa-1x"></i>  Agregar categoría</a>

    {% if item.estado %}
     <i class="fad fa-power-off fa-2x" onclick="return abrir_modal('{% url 'catalogos:categoria_desactivar' item.id %}')"
    data-toggle="tooltip" data-placement="bottom" title="Desactivar {{item.descripcion}}" style="color:seagreen; cursor: pointer;"></i>
    {% else %}
    <i class="fad fa-power-off fa-2x" onclick="return abrir_modal('{% url 'catalogos:categoria_desactivar' item.id %}')" data-toggle="tooltip" data-placement="bottom" title="Activar {{item.descripcion}}"       style="color:silver; cursor: pointer;"></i>
{% endif %}

Модал в моем базовом шаблоне:

<div class="modal fade" id="popup"></div>
...