Если вы загляните в django.contrib.auth admin.py, вы увидите, что класс UserAdmin определяет add_form как UserCreationForm.
UserCreationForm включает в себя только поле «username» из модели User.
Поскольку вы предоставляете свой собственный UserAdmin, вы можете просто переопределить add_form для пользовательской UserCreationForm, которая включает в себя поля, необходимые для правильной работы вашего сигнала.
Надеюсь, это поможет вам.
[редактировать]
Вот форма UserCreationForm от contrib.auth forms.py:
.
class UserCreationForm(forms.ModelForm):
"""
A form that creates a user, with no privileges, from the given username and password.
"""
username = forms.RegexField(label=_("Username"), max_length=30, regex=r'^[\w.@+-]+$',
help_text = _("Required. 30 characters or fewer. Letters, digits and @/./+/-/_ only."),
error_messages = {'invalid': _("This value may contain only letters, numbers and @/./+/-/_ characters.")})
password1 = forms.CharField(label=_("Password"), widget=forms.PasswordInput)
password2 = forms.CharField(label=_("Password confirmation"), widget=forms.PasswordInput,
help_text = _("Enter the same password as above, for verification."))
class Meta:
model = User
fields = ("username",)
def clean_username(self):
username = self.cleaned_data["username"]
try:
User.objects.get(username=username)
except User.DoesNotExist:
return username
raise forms.ValidationError(_("A user with that username already exists."))
def clean_password2(self):
password1 = self.cleaned_data.get("password1", "")
password2 = self.cleaned_data["password2"]
if password1 != password2:
raise forms.ValidationError(_("The two password fields didn't match."))
return password2
def save(self, commit=True):
user = super(UserCreationForm, self).save(commit=False)
user.set_password(self.cleaned_data["password1"])
if commit:
user.save()
return user
Обратите внимание на кортеж fields = ("username",), который исключает все остальные поля в модели User. Вам нужно что-то вроде:
class MyUserCreationForm(UserCreationForm):
class Meta:
model = User
fields = ('username', 'email',)
тогда вы можете использовать это как add_form в вашем пользовательском UserAdmin:
class UserAdmin(admin.ModelAdmin):
add_form = MyUserCreationForm
Уже довольно поздно в моей части мира, но я посмотрю, смогу ли я получить рабочий образец для вас завтра.
[Изменить]
Хорошо, вот необходимые изменения, которые вам нужно сделать, чтобы эта работа работала. Я тестировал его с помощью Django 1.3:
from django.contrib.auth.forms import UserCreationForm
from django.contrib.auth.admin import UserAdmin
from django.contrib.auth.models import User
from django import forms
admin.site.unregister(User)
class MyUserAdmin(UserAdmin):
add_form = MyUserCreationForm
add_fieldsets = (
(None, {
'classes': ('wide',),
'fields': ('username', 'email', 'password1', 'password2')}
),
)
admin.site.register(User, MyUserAdmin)
Я не видел, чтобы у UserAdmin изначально было свойство add_fieldset. Вот почему поле электронной почты не отображалось в форме добавления.