Slide 1

Slide 1 text

“Forms are static” – “No, they aren't”

Slide 2

Slide 2 text

Hi, I’m Markus Holtermann • Django Core Developer • CS MSc Student @m_holtermann • github.com/MarkusH • markusholtermann.eu

Slide 3

Slide 3 text

Forms are static

Slide 4

Slide 4 text

What does “static” even mean?

Slide 5

Slide 5 text

What about request dependent forms?

Slide 6

Slide 6 text

They are static too!

Slide 7

Slide 7 text

What are non-static forms then?

Slide 8

Slide 8 text

Why do you need them?

Slide 9

Slide 9 text

How does that work?

Slide 10

Slide 10 text

def modelform_factory(model, …): attrs = { ‘fields’: fields_for_model(model), ‘model’: model, } Meta = type(str('Meta'), (object,), attrs) class_attrs = {‘Meta’: Meta} class_name = model.__name__ + str('Form') return type( class_name, ModelForm, class_attrs )

Slide 11

Slide 11 text

Wait! Aren’t they still static?

Slide 12

Slide 12 text

type(name, bases, attrs) rocks!

Slide 13

Slide 13 text

django-dynamic-forms http://django-dynamic-forms.rtfd.org

Slide 14

Slide 14 text

Actions FormModel Name URLs Name FormFieldModel Options Label … … belongs to

Slide 15

Slide 15 text

@formmodel_action('Send to admins') def send_admins(form_model, form, request): # label → value mapped_data = form.get_mapped_data() # construct message message = render_to_string( 'dynamic_forms/email.txt', { 'form': form_model, 'data': mapped_data}) # send data via mail mail_admins( “New form submission”, message )

Slide 16

Slide 16 text

@dynamic_form_field class IntegerField(BaseDynamicFormField): cls = 'django.forms.EmailField' display_label = 'Email' class Meta: # attribute = [type, default, class] max_value = [int, None, forms.IntegerField] min_value = [int, None, forms.IntegerField]

Slide 17

Slide 17 text

No content

Slide 18

Slide 18 text

No content

Slide 19

Slide 19 text

No content

Slide 20

Slide 20 text

django-dynamic-forms http://django-dynamic-forms.rtfd.org

Slide 21

Slide 21 text

Thank You! @m_holtermann • github.com/MarkusH • markusholtermann.eu