Метод Django save() выполняется дважды
Я разрабатываю простое CRUD приложение. Есть две основные модели: empleado (сотрудник) и oficina (офис или отдел). Каждый "empleado" принадлежит "oficina"
class empleado(models.Model):
"""Model definition for empleado."""
apellidos = models.CharField('Apellidos', max_length=50, blank=False)
nombres = models.CharField('Nombres', max_length=50, blank=False)
full_name = models.CharField('Nombre completo', max_length=50, blank=True)
dni = models.CharField('DNI', max_length=50, blank=False, unique=True)
habilidades = models.ManyToManyField(habilidad, blank=False)
area = models.ForeignKey(oficina, on_delete=models.CASCADE, blank=False, related_name = 'area_empleado')
В модели для "oficina" есть поле "personal", которое хранит количество сотрудников в этом отделе
class oficina(models.Model):
"""Model definition for oficina."""
nombre = models.CharField('Nombre', max_length=50)
nombre_corto = models.CharField('Nombre corto', max_length=50)
personal = models.PositiveIntegerField(default = 0)
Я использовал общие представления для создания новых сотрудников
class EmpleadoCreateView(CreateView):
model = empleado
template_name = "empleado/create.html"
form_class = EmpleadoForm
success_url = reverse_lazy('empleado_app:Lista de empleados')
def form_valid(self, form):
emp = form.save(commit=False)
emp.full_name = emp.nombres + ' ' + emp.apellidos
emp.save()
return super(EmpleadoCreateView, self).form_valid(form)
Это класс EmpleadoForm:
class EmpleadoForm(forms.ModelForm):
"""Form definition for Empleado."""
class Meta:
"""Meta definition for Empleadoform."""
model = empleado
fields = ('apellidos',
'nombres',
'dni',
'habilidades',
'area',
)
widgets ={
'habilidades' : forms.CheckboxSelectMultiple()
Для того чтобы обновлять количество сотрудников, я использую пару сигналов (для модели "empleado"):
def update_personal_dec(sender, instance, **kwargs):
instance.area.personal -= 1
instance.area.save()
def update_personal_inc(sender, instance, **kwargs):
instance.area.personal += 1
instance.area.save()
post_delete.connect(update_personal_dec, sender=empleado)
post_save.connect(update_personal_inc, sender=empleado)
Когда я удаляю сотрудника, все работает нормально. Однако, когда я создаю нового сотрудника, количество сотрудников увеличивается в два раза (т.е. если в отделе 7 сотрудников (oficina.personal = 7), то после того, как я добавляю одного, их становится 9 (oficina.personal = 9)).
Есть предложения?
Большое спасибо!!!
Проблема заключается в form_valid()
. Более точно
emp.save()
return super(EmpleadoCreateView, self).form_valid(form)
В emp.save()
OP сохраняет один раз. Затем, return super().form_valid(form)
сохраняет снова, если форма действительна (что происходит, когда он создает дважды).
Я вижу, что OP не включает full_name в список полей. Теперь ОП нужно просто переопределить form_valid()
, чтобы добавить full_name
def form_valid(self, form):
form.instance.full_name = emp.nombres + ' ' + emp.apellidos
return super(EmpleadoCreateView, self).form_valid(form)