crear fila de fecha al crear superusuario

modelos.py

TITLE = ( ('Classroom', 'Classroom'), ('Playground', 'Playground'), ('Staff Room','Staff Room'), ) class Location(models.Model): user = models.ForeignKey(User,null=True) title = models.CharField('Incident Type', max_length=200,default=TITLE) parent_location_id = models.CharField('Parent Location', max_length=100, null=True, blank=True) is_active = models.BooleanField('Is Active', default=True) def location_title(sender, instance, created, **kwargs): if instance.is_superuser and not instance.location.is_active: instance.location.is_active=True instance.location.save() post_save.connect(location_title, sender=User) 

Quiero insertar los datos predeterminados en la base de datos con ciertas condiciones. manage.py createsuperuser debería suceder al crear un superusuario a través de manage.py createsuperuser comentario de manage.py createsuperuser .

No sé si es posible con django, pero es el requisito. Intenté con el código anterior. Recibo el error “Error de atributo: el objeto ‘Usuario’ no tiene el atributo ‘ubicación'” al crear un superusuario.

La muestra de lo que necesito se da a continuación.

Salida de muestra

Pruebe esta función como manejador de señales:

 def location_title(sender, instance, created, **kwargs): # Don't fire up on updates. if not created: return # Only handle new superusers. if not instance.is_superuser or not instance.is_active: return # Create a `Location` entry for new superuser. l = Location(user_id=instance.pk) l.save() post_save.connect(location_title, sender=User) 

Añadiendo opciones al campo de modelo:

Django CharField tiene choices argumentos con nombre que le permiten dar al usuario final una lista de valores posibles y una validación adecuada de ellos en formularios. El formato de la iterable es el siguiente , . Una vez que un campo ha pasado un argumento de choices , puede acceder al valor de visualización conectado a su valor interno con el método instance.get__display() .

Las opciones iterables podrían verse así:

 class Location(models.Model): class Title: CLASSROOM = 'classroom' PLAYGROUND = 'playground' STAFF_ROOM = 'staff_room' TITLE_CHOICES = ( (Title.CLASSROOM, 'Classroom'), (Title.PLAYGROUND, 'Playground'), (Title.STAFF_ROOM, 'Staff Room'), ) user = models.ForeignKey(User,null=True) title = models.CharField('Incident Type', max_length=200,choices=TITLE_CHOICES,default=Title.CLASSROOM) parent_location_id = models.CharField('Parent Location', max_length=100, null=True, blank=True) is_active = models.BooleanField('Is Active', default=True) 

La solución final es la siguiente:

 class Location(models.Model): class Title: CLASSROOM = 'classroom' PLAYGROUND = 'playground' STAFF_ROOM = 'staff_room' BASE_LOCATION = Title.CLASSROOM TITLE_CHOICES = ( (Title.CLASSROOM, 'Classroom'), (Title.PLAYGROUND, 'Playground'), (Title.STAFF_ROOM, 'Staff Room'), ) user = models.ForeignKey(User,null=True) title = models.CharField('Incident Type', max_length=200,choices=TITLE_CHOICES,default=Title.CLASSROOM) parent_location_id = models.CharField('Parent Location', max_length=100, null=True, blank=True) is_active = models.BooleanField('Is Active', default=True) def location_title(sender, instance, created, **kwargs): # Don't fire up on updates. if not created: return # Only handle new superusers. if not instance.is_superuser or not instance.is_active: return # Create a `Location` entry for new superuser. base = Location(user_id=instance.pk, title=Location.BASE_LOCATION) base.save() for value, _ in Location.TITLE_CHOICES: if value == Location.BASE_LOCATION: continue l = Location(user_id=instance.pk, title=value, parent_location_id=base.pk) l.save() post_save.connect(location_title, sender=User) 

Cuando crea el usuario o superusuario, se crea la instancia del modelo pero no tiene location fila de location correspondiente. Por lo tanto, acceder a instance.location.is_active le da el error.

Puede actualizar el manejador de señales para crear primero la instancia de location y luego establecer los atributos apropiados. Como a continuación:

 def location_title(sender, instance, created, **kwargs): #also check for created flag if created and instance.is_superuser: location = Location(user=instance) location.is_active=True location.save() post_save.connect(location_title, sender=User) 

Si desea opciones para el campo de title , puede definirlo en el campo. Su definición del campo de title no es correcta, cámbiela a

 title = models.CharField('Incident Type', max_length=200, choices=TITLE, default='Classroom') 

Está utilizando incorrectamente detfault=TITLE lugar de choices=TITLE .