2009-03-18 3 views
17

두 개의 테이블 사용자 간의 많은 관계가 있습니다. Domains 클래스에서이 관계를 정의했습니다. 그래서 도메인을 볼 때 관리 인터페이스에서 사용자를 봅니다. 그러나 사용자를 볼 때 도메인이 표시되지 않습니다. 어떻게해야합니까?Django 관리자 양식 (many to many relationship)

답변

4

당신이 찾고있는 것이 InlineModelAdmin이라고 생각합니다.

+0

아마 OP가 기대했던 것 (관계의 양쪽에서 일반적인 ManyToMany 필터 선택기를 사용하는 방법)이 아니 겠지만, 이것도 제가 사용할 해결책입니다. –

+3

관계 테이블 (내 케이스에서는 Domains_User)을 참조하는 방법 명시 적 중개 테이블이 없습니다. 이 경우 어떻게 ManyToManyRelationship에 대한 InlineModelAdmin을 사용합니까 –

8

유일한 기본 제공 방법은 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) 
+1

'사용자'(제 경우에는 '사용자'가 아닌)를 추가 할 때 이것은 저에게 맞지 않습니다. '__init__' 메쏘드에서'self.instance.id'를 검사 할 필요가있었습니다. 새로운 객체를 도메인에 할당하기 전에 save()를해야했습니다. – alalonde

14

나는 이것이 오래된 스레드라는 것을 알고 있지만 이것은 Google에서 처음 나온 결과이며 더 나은 대답이 필요하다고 생각했습니다.

class Test1(models.Model): 
    tests2 = models.ManyToManyField('Test2', blank=True) 

class Test2(models.Model): 
    tests1 = models.ManyToManyField(Test1, through=Test1.tests2.through, blank=True) 

나는 그것을 나 자신을 시험하고 결과에 매우 만족했다있다 :

this django bug report를 통해 나는 당신의 ManyToManyField이 두 모델에 표시해야하는 가장 좋은 방법을 발견했다. 아직이 우연히 사람들을 위해

+0

Test2가 호출 될 때 정의되지 않았기 때문에 논리로 보이는 "Test2"오류 메시지가 표시됩니다. 귀하의 솔루션은 비록 일하고 있다면 빛나는 것입니다 – Timo

0

, 그것은 그것은 이미 다른 응용 프로그램에 의해 정의 된 ModelAdmins 양방향 다 대다 필드를 주입하기위한 메커니즘을 제공 https://github.com/kux/django-admin-extend

을 확인하는 가치가있을 수도 있습니다.