2009-03-18 8 views

risposta

4

Penso che quello che stai cercando è InlineModelAdmin.

+0

Probabilmente non quello che l'OP sperava (un modo per utilizzare il normale selettore di filtri ManyToMany da entrambi i lati della relazione), ma questa è la soluzione che userei anch'io. –

+3

Come faccio a fare riferimento alla tabella delle relazioni (Domains_User nel mio caso) Non ho una tabella di intermediazione esplicita. In questo caso, come utilizzo InlineModelAdmin per ManyToManyRelationship –

8

L'unico modo predefinito è tramite InlineModelAdmin, ma è possibile utilizzare un ModelForm personalizzato con il proprio modello utente Admin per creare campo per questo scopo. Vedere il codice qui sotto per l'installazione semplificata (suppone 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

Questo non ha funzionato per me quando aggiungo l''utente' (non un 'utente' nel mio caso). Avevo bisogno di cercare 'self.instance.id' nel metodo' __init__', e avevo bisogno di 'save()' il nuovo oggetto prima di assegnare i domini ad esso. – alalonde

14

So che questo è un thread vecchio, ma questo è stato il primo risultato che è venuto su google e ho pensato una risposta migliore era necessario.

Via this django bug report Ho trovato il modo migliore per avere il vostro ManyToManyField visualizzato su entrambi i modelli:

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

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

ho provato io stesso e sono stato molto soddisfatto dei risultati.

+0

Viene visualizzato il messaggio di errore "Test2" non definito che sembra logico perché Test2 non è definito quando chiamato. La tua soluzione sarebbe brillante se funzionasse comunque – Timo

0

Per le persone che ancora urtano ciò, potrebbe essere opportuno verificare https://github.com/kux/django-admin-extend

Esso fornisce un meccanismo per iniettare bidirezionale molti-a-molti campi ModelAdmins già definiti da altre applicazioni.