How to specify name of a Model Form's submit button name via django-webtest

340 Views Asked by At

I'm using django-webtest to automate functional tests for a Django application. One of my ModelForms has multiple submit buttons. The template, using django-crispy-forms, looks like this:

<form action="" method="post">
{% csrf_token %}
<p>
    {{ person_form|crispy }}
    <br><br>
    {{ admin_form|crispy }}
</p>
<button id="SaveButton" type="submit" name="save_data" class="btn btn-lg btn-primary">Save</button>
<button id="VerifyButton" type="submit" name="verify_data" class="btn btn-lg btn-primary">Verify</button>
</form>

When I submit the form manually from the webpage by clicking on the Save button, the request.POST that is passed into the corresponding view method contains the 'save_data' tag that I use to decide what to do in the code.

However, when I create a django-webtest testcase to do the same, the 'save_data' tag is absent, even if I specify it in form.submit() as follows:

def test_schools_app_access_school_admin_record(self):

    school_index = self.app.get(reverse('schools:school_index'), 
                                user=self.school_admin)
    assert self.school_name in school_index    
    school_page = school_index.click(self.school_name)
    assert 'View School Administrator' in school_page

    school_admin_page = school_page.click('View School Administrator')

    person_form = school_admin_page.forms[1]   

    assert person_form['person-name'].value == self.school_admin_name

    # TODO: Figure out how to pass name='save_data' while submitting
    person_form['person-email'] = self.school_admin_email
    response = person_form.submit(name='save_data', value='save')

    # Verify that the field has been updated in the database
    person = Person.objects.get(name=self.school_admin_name)
    assert self.school_admin_email in person.email 

How do I get django-webtest to include the name of the submit button in request.POST ?

Also, since I have multiple forms on the same page, I'm currently using response.forms[1] to select the form of interest. But I would like to use the form id instead. I couldn't locate in the Django documentation how to assign the form id (not field id) to a ModelForm. Could someone help me with this?

I'm using Django 1.7, django-webtest 1.7.8, WebTest 2.0.18 and django-crispy-forms 1.4.0.

1

There are 1 best solutions below

1
On

I figured out that I'd made a typo in my code snippet because of which my code was not working.

In this fragment

person_form['person-email'] = self.school_admin_email
response = person_form.submit(name='save_data', value='save')

I should have value='Save' instead of 'save'. With this corrected, the response does contain the name 'save_data'.