2012-07-25 16 views
5

He estado buscando las mejores prácticas, pero no las encontré. Incluso no pude encontrar la solución que necesito que alguien más la use.Crear automáticamente un nombre de usuario en el modelo de usuario en Django basado en otros campos

necesito generar nombre de usuario del usuario en base a sus otros datos (Nombre & apellido), añadiendo opcionalmente número entero en el extremo, hasta que llegue el nombre de usuario único.

Prefiero hacer eso en el modelo. ¿Hay alguna forma estándar de hacer eso? ¿O solo es apropiado en las formas? He estado investigando la sobrecarga de varios métodos del modelo User, así como señales, y no encontré ningún lugar adecuado para agregarlo.

Respuesta

4

Una posible solución podría ser a través de la señal pre_save.

def my_callback(sender, **kwargs): 
    obj = kwargs['instance'] 
    if not obj.id: 
     username = get_unique_username(obj) # method that combines first name and last name then query on User model, if record found, will append integer 1 and then query again, until found unique username 
     obj.username = username 
pre_save.connect(my_callback, sender=User) 
+0

Estaba pensando en usar eso, pero me preocupa qué formas harán realmente con eso. Los formularios validan la entrada antes de realizar una llamada a 'save()', por lo que el campo se considerará no válido. Por cierto. 'obj.save()' también llamará a la señal 'pre_save', por lo que probablemente debería eliminar eso (o reemplazarlo por otra cosa que tengas en mente). – Tadeck

+0

Su solución funciona, pero no siempre (si la validación se maneja antes de guardar, no tenemos suerte) y necesita ajustes (la eliminación de 'obj.save()' y 'get_unique_username' también debería funcionar si estamos actualizando el modelo existente) . En general, creo que no hay mejor manera de hacerlo, por lo que su respuesta es aceptable. Gracias. – Tadeck

+0

@Tadeck vea la respuesta, ahora maneja su problema principal. – Ahsan

Cuestiones relacionadas