![](/img/trans.png)
[英]IntegrityError while creating django SuperUser in Production
[英]create row of date while creating superuser
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'”。
我需要的样品如下
尝试此函数作为信号处理程序:
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
,允许您为最终用户提供可能值的列表,并在表单中对它们进行适当的验证。 iterable的格式如下<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)
当您创建用户或超级用户时,会创建模型实例,但是它没有对应的location
行。 因此,访问instance.location.is_active
会给出错误。
您可以先更新信号处理程序以创建location
实例,然后设置适当的属性。 如下:
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)
如果要选择title
字段,则可以在字段中定义。 您对title
字段的定义不正确,请将其更改为
title = models.CharField('Incident Type', max_length=200, choices=TITLE,
default='Classroom')
您错误地使用了detfault=TITLE
而不是choices=TITLE
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.