У меня есть Django функциональное представление формы, которое инициализирует форму с данными по умолчанию по запросу GET и сохраняет объект модели по запросу POST:
def copy(request, ann_id):
new_ann = get_object_or_404(Announcement, pk=ann_id)
new_ann.pk = None # autogen a new primary key (quest_id by default)
new_ann.title = "Copy of " + new_ann.title
new_ann.draft = True
new_ann.datetime_released = new_ann.datetime_released + timedelta(days=7)
form = AnnouncementForm(request.POST or None, instance=new_ann)
if form.is_valid():
new_announcement = form.save(commit=False)
new_announcement.author = request.user
new_announcement.datetime_created = timezone.now()
new_announcement.save()
form.save()
return redirect(new_announcement)
context = {
"title": "",
"heading": "Copy an Announcement",
"form": form,
"submit_btn_value": "Create",
}
return render(request, "announcements/form.html", context)
Я не могу понять о том, как проверить ветку form.is_valid()
при публикации формы, не предоставляя данные формы вручную для self.client.post(url, form_data)
, на мой взгляд.
Вот что я пытаюсь:
test_views.py
class AnnouncementViewTests(TestCase):
def setUp(self):
self.client = ...
... etc
def test_copy_announcement(self):
# log in a teacher
success = self.client.login(username=self.test_teacher.username, password=self.test_password)
self.assertTrue(success)
# hit the view as a get request first, to load a copy of the announcement in the form
response = self.client.get(
reverse('announcements:copy', args=[self.test_announcement.id]),
)
self.assertEqual(response.status_code, 200)
# The form in this response should be valid, and should bw
# accepted on a post request,
# that is what I am testing in this integration test.
form_data = response.how_do_get_the_form_data() # ???????
response = self.client.post(
reverse('announcements:copy', args=[self.test_announcement.id]),
data=form_data
)
# Get the newest announcement just made in the post request
new_ann = Announcement.objects.latest('datetime_created')
self.assertRedirects(
response,
new_ann.get_absolute_url()
)
На самом деле я хочу проверить, что результат get
предоставляет действительные данные по умолчанию для формы, которую затем можно отправить с помощью запроса post
.
Но я не могу понять, как получить доступ к данным формы, полученным в результате запроса get
, поэтому я могу затем передать их в form_data, предоставленные для запроса post
.
РЕДАКТИРОВАТЬ
Я нашел расположение формы в ответе get, но я не знаю, как получить это в коде.