Ho una relazione molti a molti tra 2 utenti e domini. Ho definito questa relazione nella classe Domains. Quindi nell'interfaccia di amministrazione vedo gli utenti quando visualizzo i domini. Ma non vedo domini quando visualizzo gli utenti. Come posso ottenere questo.Modulo di amministrazione di Django per rapporti molti a molti
risposta
Penso che quello che stai cercando è InlineModelAdmin.
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)
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
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.
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
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.
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. –
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 –