Erstellen Sie eine Zeile des Datums beim Erstellen von 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) 

Ich möchte die Standard-Daten in die Datenbank mit bestimmten Bedingungen einfügen.Dies sollte passieren, während das Erstellen von Superuser über manage.py createsuperuser Kommentar.

Ich weiß nicht, dass es mit Django möglich ist, aber es ist die Anforderung.Ich habe mit dem obigen Code versucht. Ich bekomme den Fehler "AttributeError: 'User' Objekt hat kein Attribut 'location' 'beim Erstellen von Superuser.

Die Probe, die ich benötigte, ist unten angegeben

Probenausgabe

2 Solutions collect form web for “Erstellen Sie eine Zeile des Datums beim Erstellen von Superuser”

Probieren Sie diese Funktion als Signalhandler aus:

 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) 

Hinzufügen von Optionen zum Modellfeld:

Django CharField hat eine benannte Argument- choices , die Ihnen erlaubt, dem Endbenutzer eine Liste der möglichen Werte und eine korrekte Validierung von ihnen in Formularen zu geben. Das Format des iterierbaren ist wie folgt <internal_value>, <display_value> . Sobald ein Feld ein choices , können Sie mit der Methode instance.get_<field_name>_display() mit dem internen Wert verbundenen instance.get_<field_name>_display() .

Die Wähler können so aussehen:

 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) 

Die endgültige Lösung ist die folgende:

 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) 

Wenn Sie den Benutzer oder Superuser erstellen, wird die Modellinstanz erstellt, aber keine entsprechende Ortszeile. Der Zugriff auf instance.location.is_active gibt Ihnen den Fehler.

Sie können den Signalhandler aktualisieren, um die location zuerst zu erstellen und dann entsprechende Attribute zu setzen. Wie nachstehend:

 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) 

Wenn du die Wahlen für das title wählst, kannst du das im Feld definieren. Ihre Definition des Titelfeldes ist nicht korrekt, ändern Sie es auf

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

Sie sind falsch mit detfault=TITLE anstelle von choices=TITLE .

  • Django / python validieren JSON
  • Wie man <div> tag anstelle von <li> hinzufügt
  • Kann ich ein Django-Formular ohne Modell haben
  • Django: Hinzufügen von Inline-Formate-Zeilen ohne Javascript
  • Django: Wie kann man Modelle aus der Datenbank aktualisieren oder neu laden
  • Django-allauth set username das selbe wie email
  • Python ist die beste Programmiersprache der Welt.