2012-12-01 2 views
5

Ich habe ein benutzerdefiniertes Benutzermodell erstellt, das ich erfolgreich in meiner App verwende.Benutzerdefiniertes Benutzermodell in Django erlaubt keine Passworteinstellung in Admin

Das Problem ist, dass innerhalb des Admin, auf dem Benutzer bearbeiten Bildschirm, ich eine Anzeige des aktuellen Passwort-Hash, anstelle der sehr nützlichen Schnittstelle für die Einstellung des Passwortes.

Ich verwende Django 1.5b1 auf Python 2.7.

Wie kann ich den Django-Administrator davon überzeugen, mein Benutzermodell so zu behandeln, wie es den nativen Benutzer behandelt, aus Gründen der Admin-Benutzeroberfläche?

Antwort

9

Die Dokumentation schlägt vor, dass Sie das benutzerdefinierte Modell mit admin registrieren und auch einige Methoden definieren müssen, damit die Verwaltungsoberfläche mit dem benutzerdefinierten Benutzermodell funktioniert.

Möglicherweise müssen Sie auch integrierte Formulare für Benutzer definieren.

Von Custom users and django.contrib.admin

werden Sie müssen auch Ihr individuelles User-Modell mit dem Admin registrieren. Wenn Ihr benutzerdefiniertes Benutzermodell AbstractUser erweitert, können Sie die vorhandene UserAdmin-Klasse von Django verwenden. Wenn Ihr Benutzermodell jedoch AbstractBaseUser erweitert, müssen Sie eine benutzerdefinierte ModelAdmin-Klasse definieren.

+1

Es hat funktioniert! Weitere Details: Mein Modell basiert nicht auf UserAdmin, sondern sieht, redet, läuft wie einer (hat die gleichen Felder und mehr). Ich konnte mein eigenes benutzerdefiniertes Modell admin registrieren, das ich mit minimalem Aufwand und Code-Duplizierung erstellt habe. Mein Modelladministrator erweitert django.contrib.auth.admin.UserAdmin und überschreibt die Feldgruppen form und add_form. form und add_form verweisen wiederum auf benutzerdefinierte Formen von mir, die das von Django bereitgestellte UserCreationForm und UserChangeForm erweitern und die Meta-Unterklasse überschreiben, um auf mein Modell zu zeigen. Es ist erstaunlich, wie dieses Zeug zusammenarbeitet! Auch, Requisiten zu ducken. –

0

Wenn Sie AbstractBaseUser erweitern, benötigen Sie zwei Formulare, ein Erstellungsformular und ein Update-Formular ohne die Kennwörter, die von ModelForm abgeleitet sind.

Dann in der Admin-Form geben getrennt erstellen und zu aktualisieren Formen, zusammen mit entsprechender Fieldset:

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

    fieldsets = (
     (None, {'fields': ('email', 'first_name', 'last_name')}), 
    ) 
    add_fieldsets = (
     (None, {'fields': ('email', 'password', 'password2', 'first_name', 'last_name')}), 
    ) 

Passwörter für neue Benutzer arbeiten. Ändern Sie das Passwort in der vordefinierten Django-Form anstelle von admin.

1

Gerade diese zu Ihrem Formular hinzuzufügen:

password = ReadOnlyPasswordHashField(
     label= ("Password"), 
     help_text= ("Raw passwords are not stored, so there is no way to see " 
        "this user's password, but you can change the password " 
        "using <a href=\"password/\">this form</a>.")) 

entlehnt https://stackoverflow.com/a/15630360/780262

0

Mindestens in 1.10 konnte ich folgendes tun. Einfacher als oben. Ich steckte es in admin.py:

from django.contrib.auth.admin import UserAdmin 
from django.contrib import admin 
from myapp.models import MyUser 

class MyUserAdmin(UserAdmin): 
    model = MyUser 

    fieldsets = UserAdmin.fieldsets + (
      (None, {'fields': ('a_custom_field',)}), 
    ) 

admin.site.register(MyUser, MyUserAdmin)