2009-03-18 13 views

Respuesta

4

Creo que lo que estás buscando es InlineModelAdmin.

+0

Probablemente no es lo que esperaba el OP (una forma de utilizar el selector de filtro ManyToMany habitual desde cualquier lado de la relación), pero esta es la solución que yo también usaría. –

+3

¿Cómo me refiero a la tabla de relaciones (Dominios_usuario en mi caso) No tengo una tabla intermedia explícita. En este caso, ¿cómo utilizo InlineModelAdmin para ManyToManyRelationship –

8

La única forma incorporada es a través de InlineModelAdmin, pero puede usar un ModelForm personalizado con su User ModelAdmin para crear un campo para este fin. Consulte el siguiente código para obtener una configuración simplificada (asume 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

? Esto no funcionó para mí al agregar el "usuario" (no un "Usuario" en mi caso). Necesitaba verificar 'self.instance.id' en el método' __init__', y necesitaba 'guardar()' el nuevo objeto antes de asignarle dominios. – alalonde

14

sé que este es un hilo viejo, pero este fue el primer resultado que apareció en Google y me pareció una respuesta mejor era necesario.

Via this django bug report He encontrado la mejor manera de tener su ManyToManyField aparece en ambos modelos:

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

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

he probado yo mismo y era muy satisfechos con los resultados.

+0

Aparece el mensaje de error "Test2" no definido, que parece lógico porque Test2 no está definido cuando se llama. Su solución sería genial si funciona bien – Timo

0

Para las personas que todavía tropezar con esto, podría valer la pena comprobar https://github.com/kux/django-admin-extend

Proporciona un mecanismo para inyectar bidireccionales campos de muchos a muchos en ModelAdmins que ya han sido definidas por otras aplicaciones.

Cuestiones relacionadas