Skip to content

django multiform template view for multiple forms handling in one view

License

Notifications You must be signed in to change notification settings

bukdjango/multiform

Repository files navigation

multiform

Multiple forms processing in one View.

from bukdjango_multiform.views import MultiFormTemplateView

from django.http import HttpResponse, HttpResponseForbidden
from .forms import Form1, Form2
    

def logged_in(request, *args, **kwargs):
    if not request.user.is_authenticated:
        return HttpResponseForbidden(b'loginplease')


class MyMultiFormTemplateView(MultiFormTemplateView):
    template_name = 'index.html'
    multiform_field_name = 'html_field_name'
    multiforms = {
        # template context name for `Form`
        'form1_ctx': {
            'class': Form1,
            # pass view attr as keyword argument to form
            'attrs': ('request',),
            # pass view kwargs as keyword argument to form
            'kwargs': ('some_kwarg',),
        },
        'form2_ctx': {
            'class': Form2,
            # check if form can be processed
            'checks': (logged_in,),
            # save form if valid
            'save': True,
        }
    }
    
    # pass additional kwargs to `Form1`
    def get_kwargs_form1_ctx(self, **kwargs):
        kwargs.update({
            'request': None,
            'some_kwarg': None,
        })
        return kwargs
    
    def handle_valid_form2_ctx(self, form):
        return HttpResponse(b'VALID!form2_ctx')

    def handle_invalid_form2_ctx(self, form):
        return HttpResponse(b'INVALID!form2_ctx')

    def handle_valid_form1_ctx(self, form):
        return HttpResponse(b'VALID!form1_ctx')

    def handle_invalid_form1_ctx(self, form):
        return HttpResponse(b'INVALID!form1_ctx')


    class MyMultiFormTemplateView2(MyMultiFormTemplateView):
        template_name = 'index.html'
        # when subclassing all forms are collected
        # similiar to how `django.forms.Form` fields work
        multiforms = {
            'form4_ctx': {
                'class': Form2,
            },
            # delete form` from context
            'form2_ctx': None,
        }