2017-10-26 5 views
0

Ich versuche Djangos django.contrib.auth.forms.UserCreationForm zu erweitern, um E-Mail- und Namensfelder einzuschließen. Meine ähnliche Erweiterung von UserChangeForm funktioniert gut, aber UserCreationForm zeigt immer noch nur die Standardfelder Benutzername, Kennwort1 und Kennwort2 an. Irgendwelche Ideen, was ich falsch mache?Erweiterungen Djangos UserCreationForm

forms.py

class AuthorCreation(UserCreationForm): 

    class Meta: 
     model = User 
     fields = ('username', 'password1', 'password2', 
        'first_name', 'last_name', 'email', 'groups', 'is_staff') 


class AuthorChange(UserChangeForm): 

    class Meta: 
     model = User 
     fields = ('username', 'first_name', 'last_name', 
        'email', 'password', 'groups', 'is_staff') 

admin.py

class AuthorAdmin(UserAdmin): 
    """Admin class for creating and managing Authors""" 
    inlines = [AuthorInline] 

    fieldsets = (
     (None, { 
      'fields': ('username', ('first_name', 'last_name'), 
         'email', 'password', 'groups', 'is_staff') 
     }), 
    ) 

    class Media: 
     css = { 
      'all': [ 
       'css/codenotes-admin.css', 
      ] 
     } 

    def get_form(self, request, obj=None, **kwargs): 
     if obj is None: 
      return forms.AuthorCreation 
     else: 
      return forms.AuthorChange 


admin.site.unregister(User) 
admin.site.register(User, AuthorAdmin) 

Auch die AuthorChangeForm korrekt angezeigt, alle Felder, aber AuthorCreationForm zeigt nur den Benutzernamen, password1 und password2 Felder (plus die Inline Formen, die bei beiden gut funktionieren).

Ich nehme an, das Problem ist mit den Feldgruppen, aber ich kann es nicht aus der Dokumentation herausfinden.

Antwort

1

ich die Lösung herausgefunden. Das Problem war, wie ich vermutete, die Fieldsets. Es stellt sich heraus, dass die UserAdmin-Klasse zwei Fieldsets erbt, die überschrieben werden müssen: fieldsets und add_fieldsets. Ich habe das nirgendwo in der Dokumentation erwähnt (vielleicht habe ich es einfach verpasst); Ich musste durch die Quelle graben, um es zu finden. Wie der Name schon sagt, wird add_fieldsets verwendet, wenn ein neuer Benutzer hinzugefügt wird. Die folgende Admin-Klasse wie erwartet funktioniert:

admin.py

class AuthorAdmin(UserAdmin): 
    """Admin class for creating and managing Authors""" 
    inlines = [AuthorInline] 

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

    class Media: 
     css = { 
      'all': [ 
       'css/codenotes-admin.css', 
      ] 
     } 

    def get_form(self, request, obj=None, **kwargs): 
     if obj is None: 
      return forms.AuthorCreation 
     else: 
      return forms.AuthorChange 


admin.site.unregister(User) 
admin.site.register(User, AuthorAdmin) 
0

Aus dem doc Django:

Klasse UserCreationForm¶ A Modelform für einen neuen Benutzer erstellen.

Es hat drei Felder: Benutzername (aus dem Benutzermodell), password1 und password2. Er überprüft, ob password1 und password2 übereinstimmen, validiert das Passwort mit validate_password() und setzt das Benutzerpasswort mit set_password().

So scheint es, Sie die zusätzlichen Felder sich wie diese erstellen haben:

class AuthorCreation(UserCreationForm): 
    first_name = forms.CharField(required=True, label="First Name") 
    ... etc ... 

    class Meta: 
     model = User 
     fields = ('username', 'password1', 'password2', 
        'first_name', 'last_name', 'email', 'groups', 'is_staff') 
+0

gleiches Ergebnis. Ich erhalte nur die Felder Benutzername, Passwort1, Passwort2 und Inline. Nein Vorname, Nachname, E-Mail usw. –

+0

Ich aktualisierte meine Antwort, lassen Sie sehen, ob es hilft – Yannick

+0

Immer noch kein Glück, das gleiche Ergebnis. –