Generating a minimal ModelForm to add a value to a ManyToManyField on self using the related name

Hello,

I’ve been baffled by the behaviour of following code snippet (stripped down version of real code)

from django.db import models
from django import forms

class Employee(models.Model):
  id = models.BigAutoField(primary_key=True)
  name = models.CharField(max_length=32)
  managers = models.ManyToManyField(
        'self',
        blank=True,
        related_name='managed_employees',
        symmetrical=False,
    )
  class Meta:
    app_label = 'Minimal Test'

def generate_minimal_form(field):
  class UpdateManagerForm(forms.ModelForm):
    class Meta:
      model = Employee
      fields=[field]

for field_name in ["managers", "managed_employees"]:
  try:
    generate_minimal_form(field_name)
  except Exception as e:
    print(f'Could not generate minimal form for {field_name} : {e}')

It outputs

Could not generate minimal form for managed_employees : Unknown field(s) (managed_employees) specified for Employee

But on any instance of Employee,

 instance._meta.get_field('managed_employees')

Suceeds.

I’ve tracked this to the fact that managed_employeesdoes not appear in

forms.models.fields_for_model(Employee)

as it does not appear in Employee._meta.many_to_many

It seems this is because models.options.Option.add_field does not handle many_to_many fields to self, but I’m unsure as whether it should.

The high level use case is an attempt at writting a generic inline edit, where when displaying the data related to an Employee, any field can be edited in place using htmx : on a click, a form limited to the update of the current value appears. This form is limited to a select button for ManyToMany relations so as to be able to simply add new values. I might have gone to far in a bad direction before hitting this issue.

Any other ideas on how to generate a form to add a ’managed_employee’ in this use-case ?