2013-03-31 8 views
6

Ich habe das django 1.5 Benutzermodell wie unten erweitert und ich habe Probleme, wenn ich irgendeine Reihe in die Datenbank einfüge. Meine models.py Datei sieht wie folgt aus.benutzerdefiniertes Benutzermodell in django 1.5

class MyUserManager(BaseUserManager): 

    def create_user(self, email, password=None): 

    if not email: 
     raise ValueError('Users must have an email address') 

    user = self.model(
     email=MyUserManager.normalize_email(email), 
    ) 

    user.set_password(password) 
    user.save(using=self._db) 
    return user 

    def create_superuser(self, email, password): 

    user = self.create_user(email, 
     password=password 
    ) 
    user.is_admin = True 
    user.save(using=self._db) 
    return user 


class MyUser(AbstractBaseUser): 
    email = models.EmailField(
     verbose_name='Email address', 
     max_length=255, 
     unique=True, 
     db_index=True, 
    ) 
    is_active = models.BooleanField(default=True) 
    is_admin = models.BooleanField(default=False) 

    objects = MyUserManager() 

    USERNAME_FIELD = 'email' 

    def get_full_name(self): 
     # The user is identified by their email address 
     return self.email 

    def __unicode__(self): 
     return self.email 

Und meine admin.py sieht wie folgt aus.

class MyUserAdmin(UserAdmin): 
    # The forms to add and change user instances 
    form = UserChangeForm 
    add_form = UserCreationForm 

    # The fields to be used in displaying the User model. 
    # These override the definitions on the base UserAdmin 
    # that reference specific fields on auth.User. 
    list_display = ('email', 'is_admin') 
    list_filter = ('is_admin',) 
    fieldsets = (
    (None, {'fields': ('email', 'password')}), 
    ('Permissions', {'fields': ('is_admin',)}), 
    ('Important dates', {'fields': ('last_login',)}), 
    ) 
    add_fieldsets = (
    (None, { 
     'classes': ('wide',), 
     'fields': ('email', 'password1', 'password2')} 
    ), 
    ) 
    search_fields = ('email',) 
    ordering = ('email',) 
    filter_horizontal =() 

// Now register the new UserAdmin... 
admin.site.register(MyUser, MyUserAdmin) 
// ... and, since we're not using Django's builtin permissions, 
// unregister the Group model from admin. 
admin.site.unregister(Group) 

folgte ich die oben vom django Tutorial (https://docs.djangoproject.com/en/dev/topics/auth/customizing/#a-full-example)

nun das Problem, das ich habe, ist, wenn ich etwas im Admin ändern, ich bin eine Fehlermeldung unterhalb dem Sprechen zu bekommen.

(1452, 'kann kein Kind Zeile hinzufügen oder aktualisieren: a. Fremdschlüssel fehlschlägt (csiopdjango_admin_log, CONSTRAINT user_id_refs_id_c8665aa FOREIGN KEY (user_id) LITERATUR auth_user (id))')

Also, es sieht aus wie Die Tabelle django_admin_log benötigt immer einen Fremdschlüsselverweis auf das auth_user-Modell. Da ich jedoch ein Kundenbenutzermodell erstellt habe, werden die Benutzerdetails bei der Erstellung eines Superusers nur in der MyUser-Tabelle des Kunden gespeichert und im auth_user-Modell wird kein Eintrag erstellt, der das Problem zu verursachen scheint.

Wie löse ich dieses Problem? Bitte vorschlagen.

Dank Sreekanth

+0

Haben Sie 'AUTH_USER_MODEL' in Ihren Einstellungen festgelegt? https://docs.djangoproject.com/de/dev/topics/auth/customizing/#substituting-a-custom-user-model – Ngenator

+0

Ja. Ich habe AUTH_USER_MODEL festgelegt, um auf benutzerdefiniertes MyUser zu verweisen. – Dev

Antwort

7

Dieses wie eine (PostgreSQL) Datenbankfehler sehr viel aussieht - kein Fehler Django. "auth_user" wird (noch) in einer ForeignKey-Einschränkung in Ihrer Datenbankstruktur referenziert. So etwas sollte bei Ihrem benutzerdefinierten Modell, das "MyUser" genannt wird, nicht existieren. In diesem Fall sollte die Referenz etwa "accounts_myuser" oder "myappname_myuser" lauten.

Ich denke, Sie haben einen bereits vorhandenen Code einschließlich einer alten Datenbank aktualisiert. Wenn Sie die alten Admin-Protokolle nicht benötigen, löschen Sie einfach die Tabelle mit dem Namen "django_admin_log" und führen Sie "python manage.py syncdb" (oder "python manage.py migrate" ab 1.7) aus, damit Django neu erstellen kann dieser Tisch von Grund auf neu.

Seien Sie jedoch vorsichtig: Wenn Sie andere Tabellen haben, die auf das "alte" Django-Benutzermodell verweisen, werden Sie an anderen Stellen erneut in die gleiche Art von Problemen geraten.

4

Ich lief auf das gleiche Problem. Sobald Sie das Standard-Django-Benutzermodell für Ihr eigenes angepasst haben, tut Django nichts, um alte Abhängigkeiten von der Datenbank zu bereinigen, die nicht mehr verwendet werden. Es gibt tatsächlich einige der "auth_ *" -Tabellen mit einer Fremdschlüsseleinschränkung für die Tabelle "auth_user".

Sobald Sie zu Ihren neuen Authentifizierungsmodellen gewechselt haben, vergewissern Sie sich, dass keine Daten in den Tabellen "auth_ *" und "django_admin_log" vorhanden sind, löschen Sie sie und führen Sie "manage.py syncdb" erneut aus. . Sie werden feststellen, dass die Tabelle auth_user nicht neu erstellt wird, da sie nicht mehr verwendet wird und die lästige Einschränkung weg ist.

Verwandte Themen