21

私は2つのテーブルユーザーとドメインの間に多対多の関係を持っています。Domainsクラスでこの関係を定義しました。したがって、管理インターフェースでは、ドメインを表示しているときにユーザーが表示されます。ただし、ユーザーを表示しているときにドメインが表示されません。どうすればこれを達成できますか。

4

4 に答える 4

16

これは古いスレッドであることは知っていますが、これはグーグルで出てきた最初の結果であり、より良い答えが必要だと思いました。

この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)

私はそれを自分でテストし、結果に非常に満足しました。

于 2012-07-06T03:08:22.023 に答える
10

組み込みの唯一の方法は InlineModelAdmin を使用することですが、ユーザー ModelAdmin でカスタム ModelForm を使用して、この目的のためのフィールドを作成できます。簡単なセットアップについては、以下のコードを参照してください ( を想定しています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)
于 2011-04-11T17:23:16.597 に答える
5

あなたが探しているのはInlineModelAdminだと思います。

于 2009-03-19T01:38:31.567 に答える
0

まだこれに遭遇する人は、確認する価値があるかもしれません <a href="https://github.com/kux/django-admin-extend" rel="nofollow">https://github.com/kux /django-admin-extend

これは、他のアプリによって既に定義されている ModelAdmins に双方向の多対多フィールドを挿入するためのメカニズムを提供します。

于 2013-07-10T21:02:02.517 に答える