tutorial theme template personalizar customize change django django-models django-admin

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.



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.