Расширение новой пользовательской формы в админке Django

Я добавил дополнительное поле для пользователя, выполнив весь процесс создания приложения «Профиль пользователя» и расширения пользовательского модуля.

Вроде не ошибка. Что я не могу понять или найти где-либо, так это то, как показать это новое поле на странице, где администратор создает нового пользователя. Поэтому под личной информацией, такой как имя и фамилия, я хочу, чтобы было поле «Местоположение», которое я добавил в профиль пользователя.

мой профиль пользователя:

from django.db import models
from django.contrib.auth.models import User
from django.db.models.signals import post_save

class UserProfile(models.Model):
    # This field is required.
    user = models.OneToOneField(User)

    # Other fields here
    location = models.CharField(max_length=20)

# definition of UserProfile from above
# ...

def create_user_profile(sender, instance, created, **kwargs):
    if created:
        UserProfile.objects.create(user=instance)

post_save.connect(create_user_profile, sender=User)

также я хотел бы знать, как сделать электронную почту обязательной, например пароль и имя пользователя. Просто изменив модель пользователя в папке Django на:

 email = models.EmailField(_('e-mail address'), unique=True)

вообще не работал.

[ОБНОВЛЕНИЕ] Итак, это моя шляпа admin.py, которую я создал. Где я должен включить это в файл settings.py, чтобы он действительно использовал папку с добавленным пользовательским модулем и новой формой? У меня есть эта строка, но она вообще не использует новую форму AUTH_PROFILE_MODULE = 'UserProfile.UserProfile' (у меня есть папка с именем UserProfile, которая содержит два фрагмента кода)

from django.contrib import admin
from django.contrib.auth.models import User,Group
from django.contrib.auth.admin import UserAdmin
from django.contrib.auth.forms import UserCreationForm, UserChangeForm
from django import forms
from django.contrib.admin.views.main import *

class MyUserCreationForm(UserCreationForm):
    """
    A form that creates a user, with no privileges, from the given username and password.
    """
    OFFICES = (
        (0, "Global"),
        (1, "Dublin"),
        (2, "Tokyo"),
        (3, "Warsaw"),
        (4, "Beijing"),
        (5, "Seoul"),
        (6, "Taipei"),
        (7, "Orem"),
        (8, "Mountain View"),
        (9, "San Luis Obispo"),
        (10, "Roseville"),
        (11, "Pune"),
        (12, "i18n")
    )
    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."))
    location = forms.IntegerField(label=_("Location"), choices=TYPE_CHOICES)

    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


class CustomUserAdmin(UserAdmin):
    add_form = MyUserCreationForm
    inlines = [ProfileInline,]
    add_fieldsets = (
        (None, {
            'classes': ('wide',),
            'fields': ('username', 'email', 'password1', 'password2', 'location')}
        ),
    )


admin.site.unregister(User)
admin.site.register(User, CustomUserAdmin)
admin.site.register(Class, ClassAdmin)

person Angie    schedule 28.07.2011    source источник


Ответы (1)


Вам нужно будет использовать свой собственный класс UserAdmin и изменить свойство add_fieldsets, чтобы изменить отображаемые поля. см. пример этого вопроса о переполнении стека.

Если вы хотите редактировать свой экземпляр UserProfile одновременно с пользователем, одним из подходов является добавление UserProfile в качестве встроенного в ваш пользовательский UserAdmin. Надеюсь, это поможет вам.

Пример отмены регистрации встроенного администратора модели для пользователя и регистрации пользовательского:

#admin.py
from django.contrib.auth.admin import UserAdmin
from django.contrib.auth.models import User

admin.site.unregister(User)

class MyUserAdmin(UserAdmin):
    add_fieldsets = (
        (None, {
            'classes': ('wide',),
            'fields': ('username', 'email', 'password1', 'password2')}
        ),
    )

admin.site.register(User, MyUserAdmin)
person Brandon    schedule 28.07.2011
comment
Извините, я только пытаюсь реализовать это сейчас, так как раньше у меня не было времени, и я запутался из-за всех ссылок. Я предполагаю, что мне нужно создать новый файл .py с кодом для класса MyUserAdmin(UserAdmin): вы указали в stackoverflow.com/questions/6628452/ ? - person Angie; 02.08.2011
comment
Я обновил свой код, но не знаю, как заставить мой сайт его использовать. Пока это просто папка с файлами .py, которые не связаны с основным проектом. - person Angie; 03.08.2011
comment
Я добавил пример того, как зарегистрировать пользовательского администратора пользователя. - person Brandon; 03.08.2011
comment
Казалось, это совсем не помогло. В настоящее время у меня есть папка с именем UserProfile, которая содержит models.py и admin.py. У меня такое ощущение, что этот код вообще не используется. Есть ли строка кода, которую я должен включить в settings.py, чтобы использовать UserProfile? - person Angie; 04.08.2011
comment
Вам нужно будет добавить приложение к установленным приложениям в settings.py, чтобы оно заработало. - person Brandon; 04.08.2011
comment
Потрясающий! Рад, что смог тебе помочь. - person Brandon; 05.08.2011