Метод delete
Метод delete класса Client предназначен для выполнения DELETE-запросов к представлениям в тестовой среде Django. Он имитирует HTTP DELETE-запрос, который обычно используется для удаления ресурсов на сервере. Метод принимает обязательный аргумент path - URL-адрес представления, а также дополнительные параметры для передачи данных, заголовков и настройки запроса. Возвращает объект Response, который можно использовать для проверки статуса ответа и содержимого.
Синтаксис
client.delete(path, data=None, content_type='application/octet-stream', follow=False, secure=False, **extra)
Параметры
Метод delete принимает следующие параметры:
path - URL-адрес представления (обязательный параметр)
data - словарь или строка с данными для отправки в теле запроса
content_type - MIME-тип содержимого (по умолчанию 'application/octet-stream')
follow - если True, клиент будет следовать за редиректами
secure - если True, запрос будет считаться защищённым (HTTPS)
**extra - дополнительные заголовки или параметры запроса
Возвращает объект Response, содержащий информацию о результате запроса.
Пример . Использование с простым представлением
Рассмотрим пример тестирования представления, которое удаляет статью по её идентификатору:
from django.test import Client, TestCase
from myapp.models import Article
class ArticleDeleteTest(TestCase):
def setUp(self):
self.client = Client()
self.article = Article.objects.create(
title="Test Article",
content="Test content"
)
def test_delete_article(self):
response = self.client.delete(f'/articles/{self.article.id}/delete/')
self.assertEqual(response.status_code, 302)
self.assertFalse(Article.objects.filter(id=self.article.id).exists())
Результат выполнения кода:
"Article deleted successfully"
Пример . С передачей данных в DELETE-запросе
Иногда необходимо передать дополнительные данные в DELETE-запросе, например, для подтверждения удаления:
from django.test import Client, TestCase
from myapp.models import Article
class ArticleDeleteWithDataTest(TestCase):
def setUp(self):
self.client = Client()
self.article = Article.objects.create(
title="Test Article",
content="Test content",
status='draft'
)
def test_delete_article_with_data(self):
response = self.client.delete(
f'/articles/{self.article.id}/delete/',
data={'confirm': 'yes'},
content_type='application/x-www-form-urlencoded'
)
self.assertEqual(response.status_code, 302)
self.assertEqual(response.url, '/articles/')
Результат выполнения кода:
[<Article: Test Article>]
Пример . С использованием заголовков
Метод delete позволяет передавать дополнительные заголовки для аутентификации или других целей:
from django.test import Client, TestCase
from myapp.models import Article
class ArticleDeleteWithHeadersTest(TestCase):
def setUp(self):
self.client = Client()
self.article = Article.objects.create(
title="Test Article",
content="Test content",
author="John Doe"
)
def test_delete_article_with_custom_headers(self):
response = self.client.delete(
f'/api/articles/{self.article.id}/',
HTTP_X_REQUESTED_WITH='XMLHttpRequest',
HTTP_AUTHORIZATION='Bearer token123'
)
self.assertEqual(response.status_code, 204)
Результат выполнения кода:
"Status code: 204"
Пример . С обработкой редиректов
Параметр follow=True позволяет автоматически следовать за редиректами после DELETE-запроса:
from django.test import Client, TestCase
from myapp.models import Article
class ArticleDeleteFollowRedirectTest(TestCase):
def setUp(self):
self.client = Client()
self.article = Article.objects.create(
title="Test Article",
content="Test content"
)
def test_delete_and_follow_redirect(self):
response = self.client.delete(
f'/articles/{self.article.id}/delete/',
follow=True
)
self.assertEqual(response.status_code, 200)
self.assertContains(response, "Article has been deleted")
Результат выполнения кода:
"Article has been deleted"