How to ensure form data is posted correctly in Django

Viewed 67

I am populating Django formset with data from Ajax callback (barring a few form elements which are to be filled manually by the user). I am trying to automate filling most of the form elements to eliminate error. However, while "POST"ing, the data does not get saved in respective models.

Using the same process I am able to create records (where data is filled (manually) by the user). Can't find out where I am going wrong?

models.py:

class mappedTargModel(models.Model):
    mapper_id = models.AutoField(primary_key=True, verbose_name='Map ID')
    mapper_name = models.CharField(max_length=50, verbose_name='Mapper name')
    mapper_target_model = models.CharField(max_length=100, verbose_name='Target Table')
    mapper_long_text = models.CharField(max_length=250, null=True, blank=True, verbose_name='Long Text')

class mappedTargFields(models.Model):
    mapper_item = models.AutoField(primary_key=True, verbose_name='Item Number')
    mapper_header = models.ForeignKey(mappedTargModel, related_name='mapper_hdr_tab', on_delete=models.CASCADE, verbose_name='Mapper')
    mapped_field = models.CharField(max_length=100, verbose_name='Target Field')
    mapped_field_verb_name = models.CharField(max_length=100, verbose_name='Name')
    mapped_field_col_name = models.CharField(max_length=25, verbose_name='Col Name')
    mapped_field_fk_table = models.CharField(max_length=100, verbose_name='Field Related To')

views.py

def MapperDataImportConstruct(request, object_id=False):
    template = "map/mapper_construct.html"

    if object_id:
        qs_targ_model_form = mappedTargModel.objects.get(pk=object_id)
    else:
        qs_targ_model_form = mappedTargModel()

    target_field_formset = CreateMappedTargFieldsFormset()
    if request.method == 'POST':
        new_qs_targ_model_form = mappedTargModelForm(data=request.POST, instance=qs_targ_model_form)

        if new_qs_targ_model_form.is_valid():
            qs_targ_model_form = new_qs_targ_model_form.save(commit=False)
            target_field_formset = CreateMappedTargFieldsFormset(request.POST, instance=qs_targ_model_form)

            if target_field_formset.is_valid():
                qs_targ_model_form.save()
                target_field_formset.save()

    else:
        new_qs_targ_model_form = mappedTargModelForm()
        target_field_formset = CreateMappedTargFieldsFormset(instance=qs_targ_model_form)

    context = {
        'target_model_form': new_qs_targ_model_form,
        'target_field_formset': target_field_formset,
        #    .... (context objects for getting values from Ajax callback)
        #    .... (context objects for getting values from Ajax callback)
        }
    return render(request, template, context)

Template

<form action="" method="POST" class="form" id="add_new_mapper_form" novalidate>
{% csrf_token %}
    <div class="modal-content">
        <div class="modal-header modal-title">
            <h5 class="modal-title" id="addNewProductModalFormLabel">Add New Mapper</h5>
            <button type="button" id="btnCloseModalX" class="close" data-dismiss="modal" aria-label="Close"> 
                <span aria-hidden="true">&times;</span>
            </button>
        </div>
        <div class="modal-body">
            {{ target_model_form.as_p }}
            <div class="col-md-12 text-nowrap" style="font-family:'Courier New'">
                {{ target_field_formset.management_form }}
            </div>

        </div>
        <div class="modal-footer">
            <input type="submit" id="btnSaveAsMappedModal" class="btn btn-info" value="Save"> 
            <input type="button" id="btnCloseModal" class="btn btn-info" value="Close" data-dismiss="modal"> 
        </div>
    </div>
</form>
1 Answers

you have

if new_qs_targ_model_form.is_valid():
            qs_targ_model_form = new_qs_targ_model_form.save(commit=False)
            target_field_formset = CreateMappedTargFieldsFormset(request.POST, instance=qs_targ_model_form)

            if target_field_formset.is_valid():
                qs_targ_model_form.save()
                target_field_formset.save()

add else cases to do something when your form or formset is not valid(print errors at first)

Related