Как указать имя кнопки отправки формы модели через django-webtest

Я использую django-webtest для автоматизации функциональных тестов для приложения Django. Одна из моих ModelForms имеет несколько кнопок отправки. Шаблон с использованием django-crispy-forms выглядит следующим образом:

<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>

Когда я отправляю форму вручную с веб-страницы, нажимая кнопку "Сохранить", request.POST, который передается в соответствующий метод представления, содержит тег "save_data", который я использую, чтобы решить, что делать в коде.

Однако, когда я создаю тестовый пример django-webtest, чтобы сделать то же самое, тег 'save_data' отсутствует, даже если я указываю его в form.submit() следующим образом:

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 

Как я могу заставить django-webtest включить в запрос имя кнопки отправки. Post?

Кроме того, поскольку у меня есть несколько форм на одной странице, в настоящее время я использую response.forms[1], чтобы выбрать интересующую форму. Но я хотел бы использовать вместо этого идентификатор формы. Я не смог найти в документации Django, как назначить идентификатор формы (не идентификатор поля) для ModelForm. Может ли кто-нибудь помочь мне с этим?

Я использую Django 1.7, django-webtest 1.7.8, WebTest 2.0.18 и django-crispy-forms 1.4.0.

1 ответ

Я выяснил, что в своем фрагменте кода я сделал опечатку, из-за которой мой код не работал.

В этом фрагменте

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

У меня должно быть значение = "Сохранить" вместо "сохранить". После исправления ответ содержит имя "save_data".

Другие вопросы по тегам