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 ?