Объединение формы «добавить» в Django Admin из 2 или более моделей (связанных отношениями «один к одному»)

У меня есть Django по умолчанию UserCreationForm для добавления нового пользователя через приложение администратора. Я хочу добавить новые поля из другой пользовательской модели под названием UserProfile. UserProfile имеет отношения «один к одному» с моделью User Джанго. Дополнительные поля, которые есть у модели UserProfile: phone number, company name и т. д.

Есть ли способ объединить форму UserProfile с формой Django по умолчанию User при создании нового пользователя из панели администратора?

Я просмотрел документацию Django здесь по встроенным формам, но, похоже, для них требуется связь с внешним ключом.

Django 2.1

Это может потребовать некоторой работы, но вы можете продлить AbstractUser. Если вы решите пойти по этому пути, вам также потребуется создать пользовательскую форму UserCreationForm. См.: Пользовательская модель пользователя. Хотя, вероятно, есть более простые способы выполнить то, что вы пытаетесь сделать.

danny bee 10.04.2019 15:49

Спасибо, я посмотрю пользовательскую модель пользователя.

disp_name 10.04.2019 15:52
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
7
2
1 282
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Есть два способа сделать это. Во-первых, вы можете создать собственную 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'),
        }),
    )

Другие вопросы по теме