Django Admin Forma de relación de muchos a Muchos

Tengo una relación de muchos a muchos entre 2 tablas de Usuarios de Dominios.
He definido esta relación en los Dominios de la clase.
Así, en la interfaz de administración veo a los Usuarios cuando estoy viendo Dominios.
Pero no veo Dominios cuando estoy viendo los Usuarios.
¿Cómo puedo lograr esto.

InformationsquelleAutor | 2009-03-18

4 Kommentare

  1. 14

    Sé que esto es más viejo que el hilo, pero este fue el primer resultado que apareció en google y pensé que la mejor respuesta era necesario.

    A través de este informe de error de django he encontrado la mejor manera de tener su ManyToManyField se muestran 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 estaba muy contento con los resultados.

    • Me sale el mensaje de error «Test2» no definido que parece lógica porque Test2 no está definido cuando se le llama. La solución sería brillante si se trabaja a pesar de que
  2. 8

    La única manera integrada es a través de una InlineModelAdmin, pero se puede usar un custom ModelForm con su Usuario ModelAdmin para crear campo para este propósito. Ver el código de abajo para simplificar la configuración (se supone 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)
    • Esto no funciona para mí a la hora de añadir ‘usuario’ (no User en mi caso). Necesitaba comprobar self.instance.id en el __init__ método, y necesitaba save() el nuevo objeto antes de asignar dominios a ella.
  3. 5

    Creo que lo que estás buscando es InlineModelAdmin.

    • Probablemente no es lo que el OP estaba esperando (una forma de utilizar la ManyToMany selector de filtro de uno y otro lado de la relación), pero esta es la solución que yo usaría demasiado.
    • ¿Cómo puedo referir a la relación de la tabla (Domains_User en mi caso) yo no tengo una explícita intermediario de la tabla. En este caso, ¿cómo puedo usar InlineModelAdmin para ManyToManyRelationship

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea