theme - django tutorial
Formulario de administraciĆ³n de Django para relaciĆ³n de muchos a muchos (4)
Tengo una relación de muchos a muchos entre usuarios de 2 tablas y dominios. He definido esta relación en la clase Dominios. Así que en la interfaz de administración veo a los Usuarios cuando estoy viendo Dominios. Pero no veo Dominios cuando estoy viendo Usuarios. Cómo puedo conseguir esto.
Creo que lo que estás buscando es InlineModelAdmin .
La única forma integrada es a través de un InlineModelAdmin, pero puede usar un ModelForm personalizado con su User ModelAdmin para crear un campo para este propósito. Vea el código a continuación para una instalación simplificada (asume que los 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)
Para las personas que todavía se topan con esto, podría valer la pena consultar https://github.com/kux/django-admin-extend
Proporciona un mecanismo para inyectar campos bidireccionales de muchos a muchos en ModelAdmins que ya han sido definidos por otras aplicaciones.
Sé que este es un hilo más antiguo, pero este fue el primer resultado que surgió en Google y pensé que era necesaria una mejor respuesta.
A través de este informe de errores de Django , encontré la mejor manera de que aparezca ManyToManyField 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)
Lo he probado yo mismo y quedé muy satisfecho con los resultados.