Dynamic fields in Django Admin

后端 未结 9 1481
失恋的感觉
失恋的感觉 2020-12-05 05:18

I want to have additional fields regarding value of one field. Therefor I build a custom admin form to add some new fields.

Related to the blogpost of jacobian 1 thi

9条回答
  •  长情又很酷
    2020-12-05 05:43

    You can create dynamic fields and fieldset using the form meta class. Sample code is given below. Add the loop logic as per you requirements.

    class CustomAdminFormMetaClass(ModelFormMetaclass):
        """
        Metaclass for custom admin form with dynamic field
        """
        def __new__(cls, name, bases, attrs):
            for field in get_dynamic_fields: #add logic to get the fields
                attrs[field] = forms.CharField(max_length=30) #add logic to the form field
            return super(CustomAdminFormMetaClass, cls).__new__(cls, name, bases, attrs)
    
    
    class CustomAdminForm(six.with_metaclass(CustomAdminFormMetaClass, forms.ModelForm)):
        """
        Custom admin form
        """
    
        class Meta:
            model = ModelName
            fields = "__all__" 
    
    
    class CustomAdmin(admin.ModelAdmin):
        """
        Custom admin 
        """
    
        fieldsets = None
        form = CustomAdminForm
    
        def get_fieldsets(self, request, obj=None):
            """
            Different fieldset for the admin form
            """
            self.fieldsets = self.dynamic_fieldset(). #add logic to add the dynamic fieldset with fields
            return super(CustomAdmin, self).get_fieldsets(request, obj)
    
        def dynamic_fieldset(self):
            """
            get the dynamic field sets
            """
            fieldsets = []
            for group in get_field_set_groups: #logic to get the field set group
                fields = []
                for field in get_group_fields: #logic to get the group fields
                    fields.append(field)
    
                fieldset_values = {"fields": tuple(fields), "classes": ['collapse']}
                fieldsets.append((group, fieldset_values))
    
            fieldsets = tuple(fieldsets)
    
            return fieldsets
    

提交回复
热议问题