models.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)
我想在一定条件下将默认数据插入数据库中,这应该在通过manage.py createsuperuser注释创建超级用户时发生。
manage.py createsuperuser
我不知道使用django是可行的,但这是必要条件。我尝试了上面的代码。创建超级用户时收到错误“ AttributeError:’User’对象没有属性’location’”。
我需要的样品如下
尝试将此功能用作信号处理程序:
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)
向模型字段添加选择:
Django CharField有一个命名参数choices,可让您为最终用户提供可能值的列表,并以表格形式对其进行正确验证。可迭代的格式如下<internal_value>, <display_value>。将字段传递给choices参数后,您可以使用方法访问与其内部值相关的显示值instance.get_<field_name>_display()。
choices
<internal_value>, <display_value>
instance.get_<field_name>_display()
可迭代的选择可能如下所示:
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)
最终的解决方案如下:
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)