Django: How to add an extra form to a formset after it has been constructed?

后端 未结 4 1165
误落风尘
误落风尘 2021-02-01 21:44

This is roughly what I\'m trying to do:

def post(request):
    VehicleFormSet = formset_factory(StaffVehicleForm)
    if request.method == \'POST\':
        vehi         


        
4条回答
  •  清酒与你
    2021-02-01 22:34

    For posterity here is another way which works without JS (or alongside JS) and which does not require intimate knowledge of formset methods. Instead, you can just inspect the POST data and adjust it as if JS had done some work client-side. The following makes sure that there is always (at least) one empty form at the end of the formset:

    def hsview( request):
        HS_formset = formset_factory( HSTestForm, extra=3 )
        prefix='XYZZY'
        testinpost, empty = 'key', ''  # field in the form and its default/empty value
        extra=3
    
    # I prefer to do the short init of unbound forms first, so I invert the usual test ...   
        if request.method != 'POST':
    
            formset = HS_formset( prefix=prefix)
        else:
           # process POSTed forms data. 
           # pull all relevant things out of POST data, because POST itself is not mutable
            # (it doesn't matter if prefix allows in extraneous items)
    
            data = { k:v for k,v in request.POST.items() if k.startswith(prefix) } 
    
            #if there are no spare empty forms, tell it we want another form, in place of or extra to client-side JS
            #don't want to crash if unvalidated POST data is nbg so catch all ...
            try:
                n = int( data[ prefix + '-TOTAL_FORMS']) 
                test = '{}-{}-{}'.format(prefix, n-1, testinpost)
                #print(test)
                test = data.get( test, empty)
            except Exception:
                test = 'bleagh'
                # log the error if it matters enough ...
            if test != empty: 
                data[ prefix + '-TOTAL_FORMS'] = n + 1 
    
            # now the usual formset processing ...
            formset = HS_formset( data, prefix=prefix)
            # other_form = OtherForm( request.POST)
            if formset.is_valid(): 
                ...            
    

提交回复
热议问题