Джанго Администратор Форма для многих ко многим отношениям - PullRequest
17 голосов
/ 19 марта 2009

У меня есть отношения многие ко многим между двумя таблицами Users и Domains. Я определил это отношение в классе Домены. Таким образом, в интерфейсе администратора я вижу пользователей при просмотре доменов. Но я не вижу Домены при просмотре Пользователей. Как мне этого добиться.

Ответы [ 4 ]

14 голосов
/ 06 июля 2012

Я знаю, что это старая ветка, но это был первый результат, который появился в 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)

Я проверил это сам и был очень доволен результатами.

8 голосов
/ 11 апреля 2011

Единственный встроенный способ - через 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)
4 голосов
/ 19 марта 2009

Я думаю, что вы ищете InlineModelAdmin .

0 голосов
/ 11 июля 2013

Для людей, которые все еще сталкиваются с этим, возможно, стоит проверить https://github.com/kux/django-admin-extend

Он предоставляет механизм для введения двунаправленных полей «многие ко многим» в ModelAdmins, которые уже были определены другими приложениями.

...