Tengo un formulario de Django en el que tengo varios menús desplegables que tienen una opción para ingresar un valor personalizado. Para ingresar un valor personalizado, estoy usando la siguiente implementación para alternar un cuadro de texto cada vez que se selecciona el valor personalizado de esta implementación http://jsfiddle.net/6nq7w/4/

Siempre que selecciono una opción de la lista desplegable y guardo el formulario, el valor del objeto del modelo (en este caso es EmployeeInformation.dept) conserva el valor seleccionado, pero no es el caso si ingreso un valor personalizado.

En el siguiente ejemplo, utilizo una implementación desplegable encadenada para cargar el Departamento según el ID del Departamento.

Por ejemplo, digamos que al completar el formulario selecciono el valor Ventas y luego el valor de EmployeeInformation.dept = Sales, mientras que cuando selecciono la opción como Enter Manually e ingreso un nuevo valor, digo { {X2}} el objeto de modelo de Django no toma este valor ingresado manualmente como datos para el campo Dept.

Models.py

class EmployeeInformation(models.Model):
    name = models.Charfield(max_length=30,null=False, blank=False)
    dept_id = models.ForeignKey(DepartmentInformation, on_delete=models.SET_NULL, null=True)
    dept = models.ForeignKey(SubDeptInformation, on_delete=models.SET_NULL, null=True)
    salary = models.DecimalField(null=True, blank=True, decimal_places=2, max_digits=10)

Form.html

<!DOCTYPE html>
<html>
<script>
function toggleField(hideObj,showObj){
  hideObj.disabled=true;        
  hideObj.style.display='none';
  showObj.disabled=false;   
  showObj.style.display='inline';
  showObj.focus();
}
</script>
<body>
<form name="EmployeeInformation" action="#">
Department: <select name="browser" 
          onchange="if(this.options[this.selectedIndex].value=='Enter Manually'){
              toggleField(this,this.nextSibling);
              this.selectedIndex='0';
          }">
            <option></option>
            <option value="Enter Manually">[Enter Manually]</option>
            <option>HR</option>
            <option>Sales</option>
            <option>Finance</option>
        </select><input name="Dept" style="display:none;" disabled="disabled" 
            onblur="if(this.value==''){toggleField(this,this.previousSibling);}">
<input type="submit" value="Submit">
</form>
</body>
</html>

Views.py

class AddEmployeeInfo(CreateView):
    model = EmployeeInformation
    form_class = EmployeeForm
    template_name = 'form.html'
    success_url = reverse_lazy('employee_list')

¿Cómo puedo almacenar el valor ingresado manualmente como el valor del campo del objeto del modelo, es decir, en mi ejemplo EmployeeInformation.dept.name

Gracias por cualquier ayuda de antemano !!

0
Krushika Tapedia 1 oct. 2019 a las 22:26

1 respuesta

La mejor respuesta

DeptXYZ o cualquier departamento ingresado manualmente no existe en la base de datos.

dept tiene una relación ForeignKey con el modelo EmployeeInformation. Por lo tanto, para almacenar DeptXYZ o cualquier otro departamento ingresado manualmente, el departamento debe existir en la base de datos. Como, DeptXYZ no está presente en la base de datos, Django está almacenando null en su lugar.

Para almacenar DeptXYZ o cualquier otro departamento ingresado manualmente, primero deberá crear el departamento correspondiente. Deberá anular el método form_valid() de AddEmployeeInfo como se describe aquí para crear y guardar el departamento ingresado manualmente primero.

¡Espero que esto ayude!

0
Alfarhan Zahedi 1 oct. 2019 a las 19:53