Добавление строк в существующую модель пользователя изменяет страницы администратора пользователя
У меня есть модель домена с полем пользователя «многие-ко-многим» к существующей модели пользователя. Я хочу, чтобы при добавлении или изменении пользователя на этих страницах администратора пользователя выбиралось поле Domain.
Для этого я использовал admin.TabularInline
. На прилагаемых изображениях показано, как изменилась страница добавления после добавления inlines
в код. Минимальный набор полей расширился до полного набора полей, который Django использует, когда кто-то редактирует существующего пользователя, и наборы полей полностью перемешались по сравнению с исходной страницей без inlines
.
Оригинальная страница добавления пользователя
Измененная страница добавления пользователя
Это фактический код, который я пробовал, и на картинке выше показан рабочий inlines
с полем Domain, но я не хочу менять остальную часть страницы. Меня устраивает существующая модель пользователя Django и шаблоны, я не хочу создавать пользовательскую модель пользователя и шаблоны, если я могу этого избежать.
# model.py
from django.db import models
from django.contrib.auth.models import User
from django.utils.translation import gettext as _
class Domain(models.Model):
domain = models.CharField(_('Domain name'), max_length=100)
master_dns_server = models.CharField(_('Master DNS server'), max_length=100, blank=True, default='')
updatekey_secret = models.CharField(_('Key'), max_length=255, blank=True, default='')
updatekey_name = models.CharField(_('Key name'), max_length=50, blank=True, default='')
updatekey_algorythm = models.CharField(_('Key algorythm'), max_length=50, blank=True, default='')
last_transfer = models.DateTimeField(_('Last transfer'), blank=True, null=True, editable=False)
user = models.ManyToManyField(User, verbose_name=_("Domain user"), through='Domain_User')
class Meta:
ordering = ['domain']
def __str__(self):
return self.domain
class Domain_User(models.Model):
domain = models.ForeignKey(Domain, on_delete=models.CASCADE)
user = models.ForeignKey(User, on_delete=models.CASCADE)
class Meta:
verbose_name = 'Domain user'
# admin.py
from django.contrib import admin
from .models import Domain
from django.contrib.auth.admin import UserAdmin
from django.contrib.auth import get_user_model
class UserInline(admin.TabularInline):
model = Domain.user.through
verbose_name = 'Domain'
extra = 0
raw_id_fields = ['domain']
User = get_user_model()
admin.site.unregister(User)
class UserAdmin(admin.ModelAdmin):
list_display = ['username', 'get_domains']
inlines = [UserInline]
def get_queryset(self, request):
qs = super().get_queryset(request)
return qs.prefetch_related('domain_set')
@admin.display(description='domains')
def get_domains(self, obj):
return ", ".join([d.domain for d in obj.domain_set.all()])
admin.site.register(User, UserAdmin)
Как я могу использовать inlines
в UserAdmin, сохраняя оригинальное содержимое страницы?