У меня есть много разных отношений между двумя таблицами. Пользователи - Домены. Я определил эту взаимосвязь в классе Домены. Поэтому в интерфейсе администратора я вижу пользователей, когда просматриваю Домены. Но я не вижу Домены, когда я просматриваю "Пользователи". Как я могу это достичь.
Форма администратора Django для отношений "многие-многие"
Ответ 1
Я знаю, что это более старый поток, но это был первый результат, который появился в Google, и я подумал, что нужен лучший ответ.
Через этот отчет об ошибке django Я нашел лучший способ показать, что ваш ManyToManyField появился на обеих моделях:
class Test1(models.Model):
tests2 = models.ManyToManyField('Test2', blank=True)
class Test2(models.Model):
tests1 = models.ManyToManyField(Test1, through=Test1.tests2.through, blank=True)
Я сам тестировал и был очень доволен результатами.
Ответ 2
Единственный встроенный способ - через InlineModelAdmin, но вы можете использовать пользовательскую ModelForm с User ModelAdmin для создания поля для этой цели. См. Приведенный ниже код для упрощенной настройки (предполагается users = ManyToManyField(related_name='domains')
).
### yourapp/admin.py ###
from django import forms
from django.contrib import admin
from django.contrib.auth.models import User
from django.utils.translation import ugettext_lazy as _
from django.contrib.admin.widgets import FilteredSelectMultiple
from .models import Domain
class DomainAdmin(admin.ModelAdmin):
filter_horizonal = ('users',)
class UserAdminForm(forms.ModelForm):
domains = forms.ModelMultipleChoiceField(
queryset=Domain.objects.all(),
required=False,
widget=FilteredSelectMultiple(
verbose_name=_('Domains'),
is_stacked=False
)
)
class Meta:
model = User
def __init__(self, *args, **kwargs):
super(UserAdminForm, self).__init__(*args, **kwargs)
if self.instance:
self.fields['domains'].initial = self.instance.domains.all()
def save(self, commit=True):
user = super(UserAdminForm, self).save(commit=False)
user.domains = self.cleaned_data['domains']
if commit:
user.save()
user.save_m2m()
return user
class UserAdmin(admin.ModelAdmin):
form = UserAdminForm
admin.site.register(Domain, DomainAdmin)
admin.site.unregister(User)
admin.site.register(User, UserAdmin)
Ответ 3
Я думаю, что вы ищете InlineModelAdmin.
Ответ 4
Для людей, которые все еще сталкиваются с этим, стоит проверить https://github.com/kux/django-admin-extend
Он обеспечивает механизм для ввода двунаправленных полей "много-ко-многим" в ModelAdmins, которые уже были определены другими приложениями.