Search code examples
pythondjangodjango-forms

Django form add initial data to bound form


I am trying to add initial data from 1 form into the second form but I cannot seem to get it work. I've tried different methods but the closest I got came from this post

Here is my code

if request.method == 'POST':
    laptop_select_form = LaptopSelectForm(request.POST)
    if laptop_select_form.is_valid():
        laptop_model_id = literal_eval(laptop_select_form.cleaned_data['model'])[0]

        laptop_for_parts_form = LaptopForPartsForm(request.POST, laptop_id=laptop_model_id)

    if laptop_for_parts_form.is_valid():
else:
    laptop_select_form = LaptopSelectForm()
    laptop_for_parts_form = LaptopForPartsForm()

And the form

class LaptopForPartsForm(forms.ModelForm):
def __init__(self, laptop_id=0, *args, **kwargs):
    super(LaptopForPartsForm, self).__init__(*args, **kwargs)
    self.laptop_id = laptop_id

class Meta:
    model = LaptopForParts
    fields = ('__all__')
    widgets={'laptop_id': forms.HiddenInput()}

But I keep getting this error:

laptop_for_parts_form = LaptopForPartsForm(request.POST, laptop_id=laptop_model_id)
TypeError: __init__() got multiple values for argument 'laptop_id'

Can someone more experienced please point me in the right direction?


Solution

  • I changed the request.POST data and added the laptop_id before form validation

    if request.method == 'POST':
        laptop_select_form = LaptopSelectForm(request.POST)
        if laptop_select_form.is_valid():
            # Get laptop model ID from laptop_select_form
            laptop_model_id = literal_eval(laptop_select_form.cleaned_data['model'])[0]
    
            # Change immutable request.POST form data to add model ID
            _mutable = request.POST.copy()
            _mutable['laptop_id'] = laptop_model_id
    
            laptop_for_parts_form = LaptopForPartsForm(_mutable)
    
        if laptop_for_parts_form.is_valid():
            laptop_for_parts_form.save()
    else:
        laptop_select_form = LaptopSelectForm()
        laptop_for_parts_form = LaptopForPartsForm()