У меня есть форма 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>