get_changeform_initial_data with ManyToMany

114 views
Skip to first unread message

Thibault Thomas

unread,
Jul 9, 2021, 3:12:37 PM7/9/21
to Django users

Hello,

How can I use admin's get_changeform_initial_data function to prepopulate a many to many relationship widget ?

I have the following models in models.py :
___________________________________________________
class Piece(models.Model):
    vehicules = models.ManyToManyField(Vehicule, through='AppartenanceVehicule', verbose_name='véhicules')
    soustypes_piece = models.ManyToManyField(SousTypePiece, blank=False, default=None, verbose_name='sous-types de pièce')

class AppartenanceVehicule(models.Model):
    vehicule = models.ForeignKey(Vehicule, on_delete=models.CASCADE)
    piece = models.ForeignKey(Piece, on_delete=models.CASCADE)
    annee = models.PositiveSmallIntegerField('année', blank=True, null=True, validators=[MinValueValidator(1900), MaxValueValidator(2100)])

class SousTypePiece(models.Model):
    # some attributes

class Vehicule(models.Model):
   # some attributes
___________________________________________________

I use the following function in admin.py's ModelAdmin for Piece model :

_______________________________
def get_changeform_initial_data(self, request):
   if request.GET.get('vehicule_pk') and request.GET.get('soustype_piece_pk'):
        vehicule = get_object_or_404(Vehicule, pk=request.GET.get('vehicule_pk'))
        soustype_piece = get_object_or_404(SousTypePiece, pk=request.GET.get('soustype_piece_pk'))
       return {
          'vehicules': vehicule,
          'soustypes_piece': soustype_piece
       }
   elif request.GET.get('vehicule_pk'):
       vehicule = get_object_or_404(Vehicule, pk=request.GET.get('vehicule_pk'))
       return {
          'vehicules': vehicule,
       }
__________________________________

but I can only prepopulate soustypes_piece correctly. I remember I could prepopulate vehicules when I didn't use an intermediate model (using 'through'). This may be why I can still prepopulate soustypes_piece.

Any idea how I can make it work ?

Thanks,

Thibault
Reply all
Reply to author
Forward
0 new messages