Wie erstelle und speichere ich dynamische Felder in Django ModelAdmin?

Ich habe einige Modelle:

class GroupType(models.Model):
    name = models.CharField(max_length=255)

class Group(models.Model):
    name = models.CharField(max_length=255)
    group_type = models.ForeignKey(GroupType)

class Person(models.Model):
    name = models.CharField(max_length=255)
    groups = models.ManyToManyField(Group, related_name="+")

Aber in der ModelAdmin möchte ich dynamisch Felder für jeden Gruppentyp hinzufügen. Also, wenn ich zwei Gruppentypen habepublic, private, Ich möchte, dass im Admin-Formular zwei Felder angezeigt werden.public_groups undprivate_groups anstelle des eigentlichen DB-Feldesgroups.

Mehr Inf

Ich habe versucht, ein benutzerdefiniertes Formular zu erstellen, um die Felder dynamisch hinzuzufügen:

class PersonAdminForm(forms.ModelForm):
    def __init__(self, *args, **kwargs):
        super(PersonAdminForm, self).__init__(*args, **kwargs)
        new_fields = {}
        for group_type in GroupType.objects.all():
            field_name = "{0}_groups".format(group_type.name.lower())
            qs = Group.objects.filter(group_type=group_type)
            field_field = forms.ModelMultipleChoiceField(queryset=qs)
            new_fields[field_name] = field_field
        self.fields.update(new_fields)

    class Meta:
        model = Person
        fields = '__all__'

Was scheint den Trick zu tun, wenn es darum geht, die Felder zum Formular hinzuzufügen. Aber speichere diese Felder und füge sie dem @ hinPersonAdmin funktioniert nicht. Wenn ich die Felder explizit zum @ hinzufüfields Attribut auf demPersonAdmin Ich bekomme

FieldError: Unknown field(s) (public_groups, private_groups) specified for Person. Check fields/fieldsets/exclude attributes of class PersonAdmin.

Ich erhalte auch das gleiche, wenn ich versuche, sie "dynamisch" über ein benutzerdefiniertes @ hinzuzufügeget_formsets Methode

def get_fieldsets(self, request, obj=None):
    fieldsets = super(PersonAdmin, self).get_fieldsets(request, obj)
    print(self.form.fields)
    fieldsets[0][1]['fields'].extend(['public_groups', 'private_groups'])
    return fieldsets

Antworten auf die Frage(2)

Ihre Antwort auf die Frage