Skip to content

Instantly share code, notes, and snippets.

@RafGb
Last active August 29, 2015 14:02
Show Gist options
  • Save RafGb/556c6c5d6a460013b9c9 to your computer and use it in GitHub Desktop.
Save RafGb/556c6c5d6a460013b9c9 to your computer and use it in GitHub Desktop.
# Есть стандартный способ создавать динамические формы в django:
# http://jacobian.org/writing/dynamic-form-generation/
# Но если использовать такую форму в админке, динамические поля не будут показаны, тк BaseModelAdmin.get_fieldsets использует свойство # base_fields класса формы, а не fileds экземпляра.
# Я нашел такое решение (В данном случае это Inline, но можно использовать где угодно):
class AndswerInline(admin.StackedInline):
form = AndswerInlineForm
def __init__(self, *args, **kwargs):
self.form = self.get_extended_form()
super(AndswerInline, self).__init__(self, *args, **kwargs)
def get_extended_form(self):
extra_fields = self.get_extra_fields()
OriginalForm = self.form # it's AndswerInlineForm
ExtendedForm = type('ExtendedForm', (OriginalForm,), extra_fields)
# inherits OriginalForm's fields and add dynamic fields
# we can use forms.ModelForm isthead of OriginalForm
# type() returns form class, not form instance
return ExtendedForm
def get_extra_fields(self):
extra_fields = {}
for i in range(5):
extra_fields['custom_%s' % i] = forms.IntegerField(required=False)
return extra_fields
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment