Метод 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)
Вернуться на верх