创建超级用户时创建日期行

发布于 2021-01-29 15:03:51

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注释创建超级用户时发生。

我不知道使用django是可行的,但这是必要条件。我尝试了上面的代码。创建超级用户时收到错误“
AttributeError:’User’对象没有属性’location’”。

我需要的样品如下

样品输出

关注者
0
被浏览
56
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    尝试将此功能用作信号处理程序:

    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()

    可迭代的选择可能如下所示:

    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)
    


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看