У меня есть Django по умолчанию UserCreationForm
для добавления нового пользователя через приложение администратора. Я хочу добавить новые поля из другой пользовательской модели под названием UserProfile
. UserProfile
имеет отношения «один к одному» с моделью User
Джанго. Дополнительные поля, которые есть у модели UserProfile
: phone number
, company name
и т. д.
Есть ли способ объединить форму UserProfile
с формой Django по умолчанию User
при создании нового пользователя из панели администратора?
Я просмотрел документацию Django здесь по встроенным формам, но, похоже, для них требуется связь с внешним ключом.
Django 2.1
Спасибо, я посмотрю пользовательскую модель пользователя.
Есть два способа сделать это.
Во-первых, вы можете создать собственную User
модель из AbstractBase
# models.py
class MyUser(AbstractBaseUser):
profile = models.OneToOneField(UserProfile)
А затем обновите свой вид администратора.
#admin.py
from django.contrib.auth.admin import UserAdmin
class UserProfileInline(admin.TabularInline):
model = UserProfile
class MyUserAdmin(UserAdmin):
inlines = [
UserProfileInline,
]
admin.site.register(MyUser, MyUserAdmin)
Во-вторых, вы можете просто добавить OneToOneField(User)
в свою модель UserProfile
и следовать аналогичному методу, чтобы обновить представление администратора.
Предположим, у вас есть Profile
с дополнительным полем phone_number
. Так
class Profile(models.Model):
user = models.OneToOneField(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
phone_number = models.CharField(max_length=24)
Вы можете выполнить следующие шаги, чтобы добавить дополнительные поля в UserCreationForm
в Admin.
1. Создайте пользовательский UserCreationForm
Наследовать от UserCreationForm
и добавить дополнительные поля и функции.
from django import forms
from django.contrib.auth.forms import UserCreationForm
from account.models import Profile
class UserWithProfileCreationForm(UserCreationForm):
phone_number = forms.CharField(max_length=32)
def save(self, commit=True):
instance = super().save(commit=True)
profile = Profile(user=instance, phone_number=self.cleaned_data['phone_number'])
profile.save()
return instance
2. Отмените регистрацию (уже зарегистрированной) User
модели и зарегистрируйтесь снова с пользовательской формой и полями.
from django.contrib import admin
from django.contrib.auth.admin import UserAdmin
from django.contrib.auth.models import User
# unregister first
admin.site.unregister(User)
@admin.register(User)
class UserWithProfileAdmin(UserAdmin):
add_form = UserWithProfileCreationForm
add_fieldsets = (
(None, {
'classes': ('wide',),
# add any custom fields here
'fields': ('username', 'password1', 'password2', 'phone_number'),
}),
)
Это может потребовать некоторой работы, но вы можете продлить
AbstractUser
. Если вы решите пойти по этому пути, вам также потребуется создать пользовательскую форму UserCreationForm. См.: Пользовательская модель пользователя. Хотя, вероятно, есть более простые способы выполнить то, что вы пытаетесь сделать.