{"id":18546,"date":"2022-03-27T18:17:13","date_gmt":"2022-03-27T15:17:13","guid":{"rendered":"https:\/\/mob25.com\/?p=18546"},"modified":"2023-05-09T21:48:00","modified_gmt":"2023-05-09T18:48:00","slug":"unittest-v-django-testirovanie-forms","status":"publish","type":"post","link":"https:\/\/mob25.com\/blog\/unittest-v-django-testirovanie-forms\/","title":{"rendered":"Unittest \u0432 Django: \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 Forms"},"content":{"rendered":"\n<p>\u041f\u0440\u0438 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438 \u0444\u043e\u0440\u043c \u043e\u0431\u0449\u0438\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u043e\u0441\u0442\u0430\u0451\u0442\u0441\u044f \u043f\u0440\u0435\u0436\u043d\u0438\u043c: \u043d\u0435 \u0441\u0442\u043e\u0438\u0442 \u0442\u0440\u0430\u0442\u0438\u0442\u044c \u0432\u0440\u0435\u043c\u044f \u043d\u0430 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0443 Python, Django, \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u043c\u044b\u0445 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a \u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439. \u041c\u043e\u0436\u043d\u043e \u043f\u0440\u0438\u043d\u044f\u0442\u044c \u0437\u0430 \u0430\u043a\u0441\u0438\u043e\u043c\u0443, \u0447\u0442\u043e \u043f\u043e\u043b\u0435 \u0434\u043b\u044f \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0438 \u043f\u0440\u0438\u043c\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0443, \u0430 \u043f\u043e\u043b\u0435 \u044d\u043b\u0435\u043a\u0442\u0440\u043e\u043d\u043d\u043e\u0439 \u043f\u043e\u0447\u0442\u044b \u2014 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0447\u0442\u043e\u0432\u044b\u0439 \u0430\u0434\u0440\u0435\u0441: \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0430 \u0443\u0436\u0435 \u043f\u0440\u043e\u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043b\u0438 \u044d\u0442\u043e.<\/p>\n\n\n\n<p>\u0422\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u043b\u0438\u0448\u044c \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0440\u0443\u0447\u043d\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0439 \u043a\u043e\u0434.<\/p>\n\n\n\n<div id=\"ez-toc-container\" class=\"ez-toc-v2_0_86 counter-hierarchy ez-toc-counter ez-toc-grey ez-toc-container-direction\">\n<div class=\"ez-toc-title-container\">\n<p class=\"ez-toc-title\" style=\"cursor:inherit\"><\/p>\n<span class=\"ez-toc-title-toggle\"><\/span><\/div>\n<nav><ul class='ez-toc-list ez-toc-list-level-1 ' ><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-1\" href=\"https:\/\/mob25.com\/blog\/unittest-v-django-testirovanie-forms\/#%D0%A2%D0%B5%D1%81%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D1%84%D0%BE%D1%80%D0%BC\" >\u0422\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0444\u043e\u0440\u043c<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-2\" href=\"https:\/\/mob25.com\/blog\/unittest-v-django-testirovanie-forms\/#%D0%A2%D0%B5%D1%81%D1%82_%D1%81%D1%82%D0%B0%D0%BD%D0%B4%D0%B0%D1%80%D1%82%D0%BD%D0%BE%D0%B3%D0%BE_%D0%BF%D0%BE%D0%B2%D0%B5%D0%B4%D0%B5%D0%BD%D0%B8%D1%8F_%D1%84%D0%BE%D1%80%D0%BC%D1%8B\" >\u0422\u0435\u0441\u0442 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u0433\u043e \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u0444\u043e\u0440\u043c\u044b<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-3\" href=\"https:\/\/mob25.com\/blog\/unittest-v-django-testirovanie-forms\/#%D0%A2%D0%B5%D1%81%D1%82_%D0%B4%D0%BE%D0%BF%D0%BE%D0%BB%D0%BD%D0%B8%D1%82%D0%B5%D0%BB%D1%8C%D0%BD%D1%8B%D1%85_%D1%81%D1%86%D0%B5%D0%BD%D0%B0%D1%80%D0%B8%D0%B5%D0%B2_%D1%84%D0%BE%D1%80%D0%BC%D1%8B\" >\u0422\u0435\u0441\u0442 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0435\u0432 \u0444\u043e\u0440\u043c\u044b<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-4\" href=\"https:\/\/mob25.com\/blog\/unittest-v-django-testirovanie-forms\/#%D0%A1%D0%BF%D0%B5%D1%86%D0%B8%D0%B0%D0%BB%D1%8C%D0%BD%D0%B0%D1%8F_%D0%B3%D0%BB%D0%B0%D0%B2%D0%B0_%D0%B4%D0%BB%D1%8F_%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D1%87%D0%B8%D0%BA%D0%BE%D0%B2_%D1%81_coverage-%D0%B7%D0%B0%D0%B2%D0%B8%D1%81%D0%BC%D0%BE%D1%81%D1%82%D1%8C%D1%8E\" >\u0421\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u0430\u044f \u0433\u043b\u0430\u0432\u0430 \u0434\u043b\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432 \u0441 coverage-\u0437\u0430\u0432\u0438\u0441\u043c\u043e\u0441\u0442\u044c\u044e<\/a><\/li><\/ul><\/nav><\/div>\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"%D0%A2%D0%B5%D1%81%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D1%84%D0%BE%D1%80%D0%BC\"><\/span>\u0422\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0444\u043e\u0440\u043c<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p>\u0412\u0441\u0435 \u0442\u0435\u0441\u0442\u044b \u0434\u043b\u044f \u0444\u043e\u0440\u043c \u0431\u0443\u0434\u0435\u0442 \u0443\u0434\u043e\u0431\u043d\u043e \u0441\u043b\u043e\u0436\u0438\u0442\u044c \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u0444\u0430\u0439\u043b:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\"><code>\u2514\u2500\u2500 my_app\n    \u251c\u2500\u2500 __init__.py\n    \u251c\u2500\u2500 tests\n    \u2502   \u251c\u2500\u2500 __init__.py  \n    \u2502   \u251c\u2500\u2500 test_forms.py  # \u0422\u0435\u0441\u0442\u044b \u0444\u043e\u0440\u043c\n    \u2502   \u251c\u2500\u2500 test_models.py        \n    \u2502   \u251c\u2500\u2500 test_urls.py \n    \u2502   \u2514\u2500\u2500 test_views.py   \n    \u251c\u2500\u2500 admin.py\n    \u251c\u2500\u2500 forms.py\n    \u251c\u2500\u2500 models.py \n    \u2514\u2500\u2500 views.py <\/code><\/pre>\n\n\n\n<p>\u0412 \u043f\u0440\u043e\u0435\u043a\u0442\u0435&nbsp;<strong>Todo<\/strong>&nbsp;\u0444\u043e\u0440\u043c\u0430 \u0441\u043e\u0437\u0434\u0430\u043d\u0430 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043c\u043e\u0434\u0435\u043b\u0438:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\"><code><em># deals\/forms.py<\/em>\nfrom django.core.exceptions import ValidationError\nfrom django import forms\nfrom pytils.translit import slugify\n\nfrom .models import Task\n\n\nclass TaskCreateForm(forms.ModelForm):\n    \"\"\"\u0424\u043e\u0440\u043c\u0430 \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0437\u0430\u0434\u0430\u0447\u0438.\"\"\"\n\n    class Meta:\n        model = Task\n        <em># \u041c\u0430\u0433\u0438\u044f \u0414\u0436\u0430\u043d\u0433\u043e: \u0447\u0435\u0440\u0435\u0437 '__all__' \u0441\u043e\u0437\u0434\u0430\u0451\u0442\u0441\u044f \u043a\u043e\u0440\u0442\u0435\u0436 \u0438\u0437 \u0432\u0441\u0435\u0445 \u043f\u043e\u043b\u0435\u0439 \u043c\u043e\u0434\u0435\u043b\u0438;<\/em>\n        <em># labels \u0438 help_texts \u0431\u0435\u0440\u0443\u0442\u0441\u044f \u0438\u0437 \u043f\u043e\u043b\u0435\u0439 \u043c\u043e\u0434\u0435\u043b\u0438<\/em>\n        fields = '__all__'\n\n    <em># \u0412\u0430\u043b\u0438\u0434\u0430\u0446\u0438\u044f \u043f\u043e\u043b\u044f slug<\/em>\n    def clean_slug(self):\n        \"\"\"\u041e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u0441\u043b\u0443\u0447\u0430\u0439, \u0435\u0441\u043b\u0438 slug \u043d\u0435 \u0443\u043d\u0438\u043a\u0430\u043b\u0435\u043d.\"\"\"\n        cleaned_data = super().clean()\n        slug = cleaned_data.get('slug')\n        if not slug:\n            title = cleaned_data.get('title')\n            slug = slugify(title)[:100]\n        if Task.objects.filter(slug=slug).exists():\n            raise ValidationError(\n                f'\u0410\u0434\u0440\u0435\u0441 \"{slug}\" \u0443\u0436\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442, '\n                '\u043f\u0440\u0438\u0434\u0443\u043c\u0430\u0439\u0442\u0435 \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435'\n            )\n        return slug <\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"%D0%A2%D0%B5%D1%81%D1%82_%D1%81%D1%82%D0%B0%D0%BD%D0%B4%D0%B0%D1%80%D1%82%D0%BD%D0%BE%D0%B3%D0%BE_%D0%BF%D0%BE%D0%B2%D0%B5%D0%B4%D0%B5%D0%BD%D0%B8%D1%8F_%D1%84%D0%BE%D1%80%D0%BC%D1%8B\"><\/span>\u0422\u0435\u0441\u0442 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u0433\u043e \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u0444\u043e\u0440\u043c\u044b<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p>\u041e\u0431\u044b\u0447\u043d\u043e \u0444\u043e\u0440\u043c\u0430 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043f\u043e \u0442\u0430\u043a\u043e\u043c\u0443 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u044e:<\/p>\n\n\n\n<ol class=\"wp-block-list\"><li>\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u0437\u0430\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u0444\u043e\u0440\u043c\u0443 \u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 \u0435\u0451; \u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u0437 \u0444\u043e\u0440\u043c\u044b \u0443\u0445\u043e\u0434\u044f\u0442 POST-\u0437\u0430\u043f\u0440\u043e\u0441\u043e\u043c \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440.<\/li><li>\u0414\u0430\u043d\u043d\u044b\u0435 \u043f\u0440\u043e\u0445\u043e\u0434\u044f\u0442 \u0432\u0430\u043b\u0438\u0434\u0430\u0446\u0438\u044e \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0435.<\/li><li>\u0415\u0441\u043b\u0438 \u0434\u0430\u043d\u043d\u044b\u0435 \u0432\u0430\u043b\u0438\u0434\u043d\u044b \u2014 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u043a\u0430\u043a\u043e\u0435-\u0442\u043e \u043f\u043e\u043b\u0435\u0437\u043d\u043e\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435: \u0434\u0430\u043d\u043d\u044b\u0435 \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u0432 \u0431\u0430\u0437\u0443, \u0438\u043b\u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u0438\u0441\u044c\u043c\u043e, \u0438\u043b\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c, \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0432\u0448\u0438\u0439 \u0434\u0430\u043d\u043d\u044b\u0435, \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0443\u0435\u0442\u0441\u044f \u043d\u0430 \u0441\u0430\u0439\u0442\u0435.\u0412 \u043f\u0440\u043e\u0435\u043a\u0442\u0435&nbsp;<strong>Todo<\/strong>&nbsp;\u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u0444\u043e\u0440\u043c\u044b \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u0442 \u043a \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044e \u043d\u043e\u0432\u043e\u0439 \u0437\u0430\u043f\u0438\u0441\u0438 \u0432 \u043c\u043e\u0434\u0435\u043b\u0438&nbsp;<code>Task<\/code>.<\/li><li>\u041f\u043e\u0441\u043b\u0435 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438 \u0444\u043e\u0440\u043c\u044b \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u0440\u0435\u0434\u0438\u0440\u0435\u043a\u0442\u0438\u0442\u0441\u044f \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443 \u0441 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435\u043c \u043e\u0431 \u0443\u0441\u043f\u0435\u0448\u043d\u043e\u0439 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0435 \u0444\u043e\u0440\u043c\u044b.<\/li><\/ol>\n\n\n\n<p>\u0418\u043c\u0435\u0435\u0442 \u0441\u043c\u044b\u0441\u043b \u043f\u0440\u043e\u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c, \u0447\u0442\u043e<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>\u043f\u043e\u0441\u043b\u0435 \u0443\u0441\u043f\u0435\u0448\u043d\u043e\u0439 \u0432\u0430\u043b\u0438\u0434\u0430\u0446\u0438\u0438 \u0432 \u043c\u043e\u0434\u0435\u043b\u0438&nbsp;<em>Task<\/em>&nbsp;\u043f\u043e\u044f\u0432\u0438\u0442\u0441\u044f \u043d\u043e\u0432\u0430\u044f \u0437\u0430\u043f\u0438\u0441\u044c;<\/li><li>\u043f\u043e\u0441\u043b\u0435 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438 \u0432\u0430\u043b\u0438\u0434\u043d\u043e\u0439 \u0444\u043e\u0440\u043c\u044b \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043f\u0435\u0440\u0435\u0430\u0434\u0440\u0435\u0441\u0430\u0446\u0438\u044f \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443&nbsp;<code>\/added\/<\/code><\/li><\/ul>\n\n\n\n<p>\u0421\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0438 \u043c\u043e\u0436\u043d\u043e \u043d\u0435 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c: \u044d\u0442\u043e \u0434\u0435\u043b\u0430\u0435\u0442 Django, \u0432 \u044d\u0442\u043e\u043c \u0435\u043c\u0443 \u043c\u043e\u0436\u043d\u043e \u0434\u043e\u0432\u0435\u0440\u044f\u0442\u044c.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\"><code><em># deals\/tests\/tests_form.py<\/em>\nimport shutil\nimport tempfile\n\nfrom deals.forms import TaskCreateForm\nfrom deals.models import Task\nfrom django.conf import settings\nfrom django.core.files.uploadedfile import SimpleUploadedFile\nfrom django.test import Client, TestCase, override_settings\nfrom django.urls import reverse\n\n<em># \u0421\u043e\u0437\u0434\u0430\u0435\u043c \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e \u043f\u0430\u043f\u043a\u0443 \u0434\u043b\u044f \u043c\u0435\u0434\u0438\u0430-\u0444\u0430\u0439\u043b\u043e\u0432;<\/em>\n<em># \u043d\u0430 \u043c\u043e\u043c\u0435\u043d\u0442 \u0442\u0435\u0441\u0442\u0430 \u043c\u0435\u0434\u0438\u0430 \u043f\u0430\u043f\u043a\u0430 \u0431\u0443\u0434\u0435\u0442 \u043f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0430<\/em>\nTEMP_MEDIA_ROOT = tempfile.mkdtemp(dir=settings.BASE_DIR)\n\n\n<em># \u0414\u043b\u044f \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f media-\u0444\u0430\u0439\u043b\u043e\u0432 \u0432 \u0442\u0435\u0441\u0442\u0430\u0445 \u0431\u0443\u0434\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f<\/em>\n<em># \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u043f\u0430\u043f\u043a\u0430 TEMP_MEDIA_ROOT, \u0430 \u043f\u043e\u0442\u043e\u043c \u043c\u044b \u0435\u0435 \u0443\u0434\u0430\u043b\u0438\u043c<\/em>\n@override_settings(MEDIA_ROOT=TEMP_MEDIA_ROOT)\nclass TaskCreateFormTests(TestCase):\n    @classmethod\n    def setUpClass(cls):\n        super().setUpClass()\n        <em># \u0421\u043e\u0437\u0434\u0430\u0435\u043c \u0437\u0430\u043f\u0438\u0441\u044c \u0432 \u0431\u0430\u0437\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0441\u0443\u0448\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0433\u043e slug<\/em>\n        Task.objects.create(\n            title='\u0422\u0435\u0441\u0442\u043e\u0432\u044b\u0439 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a',\n            text='\u0422\u0435\u0441\u0442\u043e\u0432\u044b\u0439 \u0442\u0435\u043a\u0441\u0442',\n            slug='first'\n        )\n        <em># \u0421\u043e\u0437\u0434\u0430\u0435\u043c \u0444\u043e\u0440\u043c\u0443, \u0435\u0441\u043b\u0438 \u043d\u0443\u0436\u043d\u0430 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u043e\u0432<\/em>\n        cls.form = TaskCreateForm()\n\n    @classmethod\n    def tearDownClass(cls):\n        super().tearDownClass()\n        <em># \u041c\u043e\u0434\u0443\u043b\u044c shutil - \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 Python \u0441 \u0443\u0434\u043e\u0431\u043d\u044b\u043c\u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430\u043c\u0438 <\/em>\n        <em># \u0434\u043b\u044f \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0444\u0430\u0439\u043b\u0430\u043c\u0438 \u0438 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044f\u043c\u0438: <\/em>\n        <em># \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435, \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435, \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435, \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0435\u043d\u0438\u0435, \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u043f\u0430\u043f\u043e\u043a \u0438 \u0444\u0430\u0439\u043b\u043e\u0432<\/em>\n        <em># \u041c\u0435\u0442\u043e\u0434 shutil.rmtree \u0443\u0434\u0430\u043b\u044f\u0435\u0442 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044e \u0438 \u0432\u0441\u0451 \u0435\u0451 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435<\/em>\n        shutil.rmtree(TEMP_MEDIA_ROOT, ignore_errors=True)\n        \n\n    def setUp(self):\n        <em># \u0421\u043e\u0437\u0434\u0430\u0435\u043c \u043d\u0435\u0430\u0432\u0442\u043e\u0440\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043a\u043b\u0438\u0435\u043d\u0442<\/em>\n        self.guest_client = Client()\n\n    def test_create_task(self):\n        \"\"\"\u0412\u0430\u043b\u0438\u0434\u043d\u0430\u044f \u0444\u043e\u0440\u043c\u0430 \u0441\u043e\u0437\u0434\u0430\u0435\u0442 \u0437\u0430\u043f\u0438\u0441\u044c \u0432 Task.\"\"\"\n        <em># \u041f\u043e\u0434\u0441\u0447\u0438\u0442\u0430\u0435\u043c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0437\u0430\u043f\u0438\u0441\u0435\u0439 \u0432 Task<\/em>\n        tasks_count = Task.objects.count()  \n        <em># \u0414\u043b\u044f \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0439 <\/em>\n        <em># \u0431\u0435\u0440\u0451\u043c \u0431\u0430\u0439\u0442-\u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0438, <\/em>\n        <em># \u0441\u043e\u0441\u0442\u043e\u044f\u0449\u0435\u0439 \u0438\u0437 \u0434\u0432\u0443\u0445 \u043f\u0438\u043a\u0441\u0435\u043b\u0435\u0439: \u0431\u0435\u043b\u043e\u0433\u043e \u0438 \u0447\u0451\u0440\u043d\u043e\u0433\u043e<\/em>\n        small_gif = (            \n             b'\\x47\\x49\\x46\\x38\\x39\\x61\\x02\\x00'\n             b'\\x01\\x00\\x80\\x00\\x00\\x00\\x00\\x00'\n             b'\\xFF\\xFF\\xFF\\x21\\xF9\\x04\\x00\\x00'\n             b'\\x00\\x00\\x00\\x2C\\x00\\x00\\x00\\x00'\n             b'\\x02\\x00\\x01\\x00\\x00\\x02\\x02\\x0C'\n             b'\\x0A\\x00\\x3B'\n        )\n        uploaded = SimpleUploadedFile(\n            name='small.gif',\n            content=small_gif,\n            content_type='image\/gif'\n        )\n        form_data = {\n            'title': '\u0422\u0435\u0441\u0442\u043e\u0432\u044b\u0439 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a',\n            'text': '\u0422\u0435\u0441\u0442\u043e\u0432\u044b\u0439 \u0442\u0435\u043a\u0441\u0442',\n            'image': uploaded,\n        }\n        <em># \u041e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c POST-\u0437\u0430\u043f\u0440\u043e\u0441<\/em>\n        response = self.guest_client.post(\n            reverse('deals:home'),\n            data=form_data,\n            follow=True\n        )\n        <em># \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c, \u0441\u0440\u0430\u0431\u043e\u0442\u0430\u043b \u043b\u0438 \u0440\u0435\u0434\u0438\u0440\u0435\u043a\u0442<\/em>\n        self.assertRedirects(response, reverse('deals:task_added'))\n        <em># \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c, \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u043b\u043e\u0441\u044c \u043b\u0438 \u0447\u0438\u0441\u043b\u043e \u043f\u043e\u0441\u0442\u043e\u0432<\/em>\n        self.assertEqual(Task.objects.count(), tasks_count+1)\n        <em># \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c, \u0447\u0442\u043e \u0441\u043e\u0437\u0434\u0430\u043b\u0430\u0441\u044c \u0437\u0430\u043f\u0438\u0441\u044c \u0441 \u0437\u0430\u0434\u0430\u043d\u043d\u044b\u043c \u0441\u043b\u0430\u0433\u043e\u043c<\/em>\n        self.assertTrue(\n            Task.objects.filter(\n                slug='testovyij-zagolovok',\n                text='\u0422\u0435\u0441\u0442\u043e\u0432\u044b\u0439 \u0442\u0435\u043a\u0441\u0442',\n                image='tasks\/small.gif'\n                ).exists()\n        ) <\/code><\/pre>\n\n\n\n<p>\u041f\u0440\u0438 \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u0434\u043b\u044f \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043d\u0435 \u0441\u0442\u043e\u0438\u0442 \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0442\u044c \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0438, \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u044b \u0438\u043b\u0438 \u043a\u0430\u043a\u0438\u0435-\u0442\u043e \u0438\u043d\u044b\u0435 \u0444\u0430\u0439\u043b\u044b \u0441 \u0432\u0430\u0448\u0435\u0433\u043e \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u0430. \u0412\u0441\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0434\u043b\u044f \u0442\u0435\u0441\u0442\u043e\u0432 \u0434\u043e\u043b\u0436\u043d\u044b \u0431\u044b\u0442\u044c \u0432 \u0444\u0438\u043a\u0441\u0442\u0443\u0440\u0430\u0445.<\/p>\n\n\n\n<p>\u0421\u0430\u043c\u044b\u0439 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u2014 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u00a0<a href=\"https:\/\/docs.python.org\/3\/reference\/lexical_analysis.html#string-and-bytes-literals\" target=\"_blank\" rel=\"noreferrer noopener nofollow\">\u0431\u0430\u0439\u0442-\u0441\u0442\u0440\u043e\u043a\u0438 (\u043d\u0435\u0438\u0437\u043c\u0435\u043d\u044f\u0435\u043c\u044b\u0435 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0445 \u0431\u0430\u0439\u0442\u043e\u0432)<\/a>\u00a0\u0438 \u044d\u043c\u0443\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0444\u0430\u0439\u043b \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0438 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u043e\u0439 \u0432 Django\u00a0<a href=\"https:\/\/docs.djangoproject.com\/en\/3.0\/_modules\/django\/core\/files\/uploadedfile\/\" target=\"_blank\" rel=\"noreferrer noopener nofollow\">\u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 SimpleUploadedFile<\/a>, \u043a\u0430\u043a \u044d\u0442\u043e \u0438 \u0441\u0434\u0435\u043b\u0430\u043d\u043e \u0432 \u043b\u0438\u0441\u0442\u0438\u043d\u0433\u0435.<\/p>\n\n\n\n<p>\u041f\u0440\u0438 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438 \u043c\u043e\u0434\u0443\u043b\u044c&nbsp;<code>SimpleUploadFile<\/code>&nbsp;\u043d\u0435 \u044d\u043c\u0443\u043b\u0438\u0440\u0443\u0435\u0442 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u043a\u0430\u0440\u0442\u0438\u043d\u043e\u043a, \u0430 \u043d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442 \u0438\u0445 \u0432 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044e&nbsp;<em>media\/tasks.<\/em>&nbsp;\u0412 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u043f\u043e\u0441\u043b\u0435 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0442\u0435\u0441\u0442\u0430 \u0432 \u044d\u0442\u043e\u0439 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438 \u0431\u0443\u0434\u0435\u0442 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0442\u044c\u0441\u044f \u043f\u043e \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0435. \u041b\u0443\u0447\u0448\u0435 \u043f\u0440\u0438\u0431\u0440\u0430\u0442\u044c\u0441\u044f \u0437\u0430 \u0441\u043e\u0431\u043e\u0439 \u0438 \u043d\u0435 \u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c \u043d\u0438\u043a\u0430\u043a\u043e\u0433\u043e \u043c\u0443\u0441\u043e\u0440\u0430 \u043f\u043e\u0441\u043b\u0435 \u0442\u0435\u0441\u0442\u043e\u0432.<\/p>\n\n\n\n<p>\u041f\u0440\u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0435 \u0442\u0435\u0441\u0442\u043e\u0432\u00a0<a href=\"https:\/\/docs.python.org\/3.7\/library\/tempfile.html#tempfile.TemporaryDirectory\" target=\"_blank\" rel=\"noreferrer noopener nofollow\">\u043c\u043e\u0436\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044e<\/a>\u00a0\u0434\u043b\u044f \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0444\u0430\u0439\u043b\u043e\u0432. \u042d\u0442\u0430 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u043e\u043f\u0438\u0441\u0430\u043d\u0430 \u0432 \u043c\u0435\u0442\u043e\u0434\u0435\u00a0<code>setUpClass<\/code>.<\/p>\n\n\n\n<p>\u041c\u0435\u0442\u043e\u0434&nbsp;<code>tearDownClass<\/code>&nbsp;\u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u043f\u043e \u043e\u043a\u043e\u043d\u0447\u0430\u043d\u0438\u0438 \u0432\u0441\u0435\u0445 \u0442\u0435\u0441\u0442\u043e\u0432 \u043a\u043b\u0430\u0441\u0441\u0430, \u0438 \u0432 \u043d\u0451\u043c \u0447\u0435\u0440\u0435\u0437 \u043c\u0435\u0442\u043e\u0434&nbsp;<code>shutil.rmtree()<\/code>&nbsp;\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u043f\u0430\u043f\u043a\u0430 \u0443\u0434\u0430\u043b\u044f\u0435\u0442\u0441\u044f \u2014 \u0432\u043c\u0435\u0441\u0442\u0435 \u0441 \u0437\u0430\u0433\u0440\u0443\u0436\u0435\u043d\u043d\u044b\u043c\u0438 \u0432 \u043d\u0435\u0451 \u0444\u0430\u0439\u043b\u0430\u043c\u0438. \u0422\u0435\u043f\u0435\u0440\u044c \u0432\u0441\u0451 \u0447\u0438\u0441\u0442\u0435\u043d\u044c\u043a\u043e, \u043a\u0430\u043a \u0431\u0443\u0434\u0442\u043e \u043d\u0438\u0447\u0435\u0433\u043e \u0438 \u043d\u0435 \u0431\u044b\u043b\u043e.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"%D0%A2%D0%B5%D1%81%D1%82_%D0%B4%D0%BE%D0%BF%D0%BE%D0%BB%D0%BD%D0%B8%D1%82%D0%B5%D0%BB%D1%8C%D0%BD%D1%8B%D1%85_%D1%81%D1%86%D0%B5%D0%BD%D0%B0%D1%80%D0%B8%D0%B5%D0%B2_%D1%84%D0%BE%D1%80%D0%BC%D1%8B\"><\/span>\u0422\u0435\u0441\u0442 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0435\u0432 \u0444\u043e\u0440\u043c\u044b<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p>\u0417\u0430\u043f\u0438\u0441\u044c \u0432 \u043f\u043e\u043b\u0435&nbsp;<code>slug<\/code>&nbsp;\u0434\u043e\u043b\u0436\u043d\u0430 \u0431\u044b\u0442\u044c \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0439, \u043e\u0434\u043d\u0430\u043a\u043e \u043f\u0440\u0438 \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0438 \u043f\u043e\u043b\u044f (\u0440\u0443\u0447\u043d\u043e\u043c \u0438\u043b\u0438 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u043c) \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0441\u043e\u0437\u0434\u0430\u043d\u043e \u043d\u0435\u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435.<\/p>\n\n\n\n<p>\u0412 \u0442\u0430\u043a\u043e\u0439 \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u0438 \u0437\u0430\u043f\u0438\u0441\u044c \u0432 \u0431\u0430\u0437\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u043d\u0435 \u0434\u043e\u043b\u0436\u043d\u0430 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c\u0441\u044f, \u043d\u043e \u0441\u0430\u0439\u0442 \u043d\u0435 \u0434\u043e\u043b\u0436\u0435\u043d \u0443\u043f\u0430\u0441\u0442\u044c.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\"><code><em># deals\/tests\/tests_form.py<\/em>\nfrom django.core.files.uploadedfile import SimpleUploadedFile\nfrom django.test import Client, TestCase\nfrom django.urls import reverse\n\nfrom deals.forms import TaskCreateForm\nfrom deals.models import Task\n\n\nclass TaskCreateFormTests(TestCase):\n    @classmethod\n    def setUpClass(cls):\n        super().setUpClass()\n        <em># \u0421\u043e\u0437\u0434\u0430\u0435\u043c \u0437\u0430\u043f\u0438\u0441\u044c \u0432 \u0431\u0430\u0437\u0435 \u0434\u0430\u043d\u043d\u044b\u0445<\/em>\n        Task.objects.create(\n            title='\u0422\u0435\u0441\u0442\u043e\u0432\u044b\u0439 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a',\n            text='\u0422\u0435\u0441\u0442\u043e\u0432\u044b\u0439 \u0442\u0435\u043a\u0441\u0442',\n            slug='first'\n        )\n\n    def setUp(self):\n        <em># \u0421\u043e\u0437\u0434\u0430\u0435\u043c \u043d\u0435\u0430\u0432\u0442\u043e\u0440\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043a\u043b\u0438\u0435\u043d\u0442<\/em>\n        self.guest_client = Client()\n\n    def test_cant_create_existing_slug(self):\n        <em># \u041f\u043e\u0434\u0441\u0447\u0438\u0442\u0430\u0435\u043c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0437\u0430\u043f\u0438\u0441\u0435\u0439 \u0432 Task<\/em>\n        tasks_count = Task.objects.count()\n        form_data = {\n            'title': '\u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u0438\u0437 \u0444\u043e\u0440\u043c\u044b',\n            'text': '\u0422\u0435\u043a\u0441\u0442 \u0438\u0437 \u0444\u043e\u0440\u043c\u044b',\n            'slug': 'first', <em># \u041e\u0442\u043f\u0440\u0430\u0432\u0438\u043c \u0432 \u0444\u043e\u0440\u043c\u0443 slug, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0443\u0436\u0435 \u0435\u0441\u0442\u044c \u0432 \u0411\u0414<\/em>\n        }\n        response = self.guest_client.post(\n            reverse('deals:home'),\n            data=form_data,\n            follow=True\n        )\n        <em># \u0423\u0431\u0435\u0434\u0438\u043c\u0441\u044f, \u0447\u0442\u043e \u0437\u0430\u043f\u0438\u0441\u044c \u0432 \u0431\u0430\u0437\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u043d\u0435 \u0441\u043e\u0437\u0434\u0430\u043b\u0430\u0441\u044c: <\/em>\n        <em># \u0441\u0440\u0430\u0432\u043d\u0438\u043c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0437\u0430\u043f\u0438\u0441\u0435\u0439 \u0432 Task \u0434\u043e \u0438 \u043f\u043e\u0441\u043b\u0435 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438 \u0444\u043e\u0440\u043c\u044b<\/em>\n        self.assertEqual(Task.objects.count(), tasks_count)\n        <em># \u041f\u0440\u043e\u0432\u0435\u0440\u0438\u043c, \u0447\u0442\u043e \u0444\u043e\u0440\u043c\u0430 \u0432\u0435\u0440\u043d\u0443\u043b\u0430 \u043e\u0448\u0438\u0431\u043a\u0443 \u0441 \u043e\u0436\u0438\u0434\u0430\u0435\u043c\u044b\u043c \u0442\u0435\u043a\u0441\u0442\u043e\u043c:<\/em>\n        <em># \u0438\u0437 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 responce \u0431\u0435\u0440\u0451\u043c \u0441\u043b\u043e\u0432\u0430\u0440\u044c 'form', <\/em>\n        <em># \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c \u043e\u0436\u0438\u0434\u0430\u0435\u043c\u0443\u044e \u043e\u0448\u0438\u0431\u043a\u0443 \u0434\u043b\u044f \u043f\u043e\u043b\u044f 'slug' \u044d\u0442\u043e\u0433\u043e \u0441\u043b\u043e\u0432\u0430\u0440\u044f<\/em>\n        self.assertFormError(\n            response, \n            'form',\n            'slug',\n            '\u0410\u0434\u0440\u0435\u0441 \"first\" \u0443\u0436\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442, \u043f\u0440\u0438\u0434\u0443\u043c\u0430\u0439\u0442\u0435 \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435'\n        )\n        <em># \u041f\u0440\u043e\u0432\u0435\u0440\u0438\u043c, \u0447\u0442\u043e \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0443\u043f\u0430\u043b\u043e \u0438 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430 \u043e\u0442\u0434\u0430\u0451\u0442 \u043a\u043e\u0434 200<\/em>\n        self.assertEqual(response.status_code, 200) <\/code><\/pre>\n\n\n\n<p>\u0412 \u0442\u0435\u0441\u0442\u0435 \u043f\u0440\u0438\u043c\u0435\u043d\u0451\u043d \u043c\u0435\u0442\u043e\u0434&nbsp;<code>assertFormError()<\/code>. \u0415\u0433\u043e \u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u2014 \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c, \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u044e\u0442 \u043b\u0438 \u043f\u043e\u043b\u044f \u0444\u043e\u0440\u043c\u044b \u043e\u0436\u0438\u0434\u0430\u0435\u043c\u044b\u0435 \u043e\u0448\u0438\u0431\u043a\u0438.\u0412 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u0430\u0445 \u043c\u0435\u0442\u043e\u0434\u0430, \u043a\u0440\u043e\u043c\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u0430&nbsp;<code>response<\/code>, \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>\u0438\u043c\u044f \u0444\u043e\u0440\u043c\u044b (\u043a\u0430\u043a \u043e\u043d\u043e \u0443\u043a\u0430\u0437\u0430\u043d\u043e \u0432 \u0441\u043b\u043e\u0432\u0430\u0440\u0435&nbsp;<code>context<\/code>),<\/li><li>\u0438\u043c\u044f \u043f\u043e\u043b\u044f, \u043e\u0448\u0438\u0431\u043a\u0443 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043d\u0443\u0436\u043d\u043e \u043f\u0440\u043e\u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c,<\/li><li>\u043e\u0436\u0438\u0434\u0430\u0435\u043c\u044b\u0439 \u0442\u0435\u043a\u0441\u0442 \u043e\u0448\u0438\u0431\u043a\u0438.<\/li><\/ul>\n\n\n\n<p>\u041e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u043c\u0435\u0442\u043e\u0434\u0430\u00a0<code>assertFormError()<\/code>\u00a0\u043c\u043e\u0436\u043d\u043e\u00a0<a href=\"https:\/\/docs.djangoproject.com\/en\/3.1\/topics\/testing\/tools\/#django.test.SimpleTestCase.assertFormError\" target=\"_blank\" rel=\"noreferrer noopener nofollow\">\u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0432 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438<\/a>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"%D0%A1%D0%BF%D0%B5%D1%86%D0%B8%D0%B0%D0%BB%D1%8C%D0%BD%D0%B0%D1%8F_%D0%B3%D0%BB%D0%B0%D0%B2%D0%B0_%D0%B4%D0%BB%D1%8F_%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D1%87%D0%B8%D0%BA%D0%BE%D0%B2_%D1%81_coverage-%D0%B7%D0%B0%D0%B2%D0%B8%D1%81%D0%BC%D0%BE%D1%81%D1%82%D1%8C%D1%8E\"><\/span>\u0421\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u0430\u044f \u0433\u043b\u0430\u0432\u0430 \u0434\u043b\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432 \u0441 coverage-\u0437\u0430\u0432\u0438\u0441\u043c\u043e\u0441\u0442\u044c\u044e<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p>\u0422\u0430\u043a \u0443\u0434\u0430\u0447\u043d\u043e \u0441\u043b\u043e\u0436\u0438\u043b\u043e\u0441\u044c, \u0447\u0442\u043e \u043c\u0435\u0442\u043a\u0438 \u043f\u043e\u043b\u0435\u0439 \u0444\u043e\u0440\u043c\u044b (<em>labels<\/em>) \u0438 \u0442\u0435\u043a\u0441\u0442\u044b \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043e\u043a (<em>help_text<\/em>) \u0443\u0436\u0435 \u043f\u0440\u043e\u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u044b \u0432 \u043c\u043e\u0434\u0435\u043b\u044f\u0445, \u0432\u0442\u043e\u0440\u043e\u0439 \u0440\u0430\u0437 \u0438\u0445 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043d\u0435 \u043d\u0430\u0434\u043e. \u0412 99 \u0438\u0437 100 \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432 \u0438\u0445 \u0432\u043e\u043e\u0431\u0449\u0435 \u043d\u0435 \u0442\u0435\u0441\u0442\u0438\u0440\u0443\u044e\u0442.<\/p>\n\n\n\n<p><strong>\u0425\u043e\u0437\u044f\u0439\u043a\u0435 \u043d\u0430 \u0437\u0430\u043c\u0435\u0442\u043a\u0443<\/strong>&nbsp;\u2014&nbsp;<em>labels<\/em>&nbsp;\u0438&nbsp;<em>help_texts<\/em>&nbsp;\u043b\u0443\u0447\u0448\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0442\u044c \u0438 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432 \u043c\u043e\u0434\u0435\u043b\u044f\u0445, \u0430 \u043d\u0435 \u0432 \u0444\u043e\u0440\u043c\u0430\u0445: \u044d\u0442\u043e \u0431\u043e\u043b\u0435\u0435 \u0443\u043d\u0438\u0432\u0435\u0440\u0441\u0430\u043b\u044c\u043d\u044b\u0439 \u0441\u043f\u043e\u0441\u043e\u0431.\u041d\u043e \u0435\u0441\u043b\u0438&nbsp;<em>labels<\/em>&nbsp;\u0438&nbsp;<em>help_texts<\/em>&nbsp;\u0431\u044b\u043b\u0438 \u043f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u044b \u0438 \u044d\u0442\u043e \u0432\u0430\u0436\u043d\u043e \u0434\u043b\u044f \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u043f\u0440\u0438 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u0444\u043e\u0440\u043c \u2014 \u0438\u0445 \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c.\u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0432 \u043a\u0430\u043a\u043e\u043c-\u0442\u043e \u0432\u043e\u043e\u0431\u0440\u0430\u0436\u0430\u0435\u043c\u043e\u043c \u0444\u0430\u0439\u043b\u0435&nbsp;<em>forms.py<\/em>&nbsp;\u0444\u043e\u0440\u043c\u0430 \u043e\u043f\u0438\u0441\u0430\u043d\u0430 \u0442\u0430\u043a:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\"><code><em># \u0412\u043e\u043e\u0431\u0440\u0430\u0436\u0430\u0435\u043c\u044b\u0439 my_app\/forms.py<\/em>\nfrom django import forms\n\nfrom .models import Imagination\n\n\nclass ImaginForm(forms.ModelForm):\n    class Meta:\n        model = Imagination\n        fields = '__all__'\n        labels = {\n            'title': '\u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u0438\u0437 \u0444\u043e\u0440\u043c\u044b',\n        }\n        help_texts = {\n            'help_texts': '\u0422\u0435\u043a\u0441\u0442 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0438 \u0438\u0437 \u0444\u043e\u0440\u043c\u044b',\n        } <\/code><\/pre>\n\n\n\n<p>\u041f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c&nbsp;<em>labels<\/em>&nbsp;\u0438&nbsp;<em>help_text<\/em>&nbsp;\u044d\u0442\u043e\u0439 \u0444\u043e\u0440\u043c\u044b \u043c\u043e\u0436\u043d\u043e \u0442\u0430\u043a:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\"><code><em># \u0412\u043e\u043e\u0431\u0440\u0430\u0436\u0430\u0435\u043c\u044b\u0439 my_app\/tests\/test_forms.py<\/em>\nfrom django.test import Client, TestCase\n\nfrom my_app.forms import ImaginForm\n\n\nclass ImaginFormTests(TestCase):\n    @classmethod\n    def setUpClass(cls):\n        super().setUpClass()\n        cls.form = ImaginForm()\n\n    def test_title_label(self):\n        title_label = ImaginFormTests.form.fields['title'].label \n        self.assertTrue(title_label, '\u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u0438\u0437 \u0444\u043e\u0440\u043c\u044b')\n\n    def test_title_help_text(self):\n        title_help_text = ImaginFormTests.form.fields['title'].help_text \n        self.assertTrue(title_help_text, '\u0422\u0435\u043a\u0441\u0442 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0438 \u0438\u0437 \u0444\u043e\u0440\u043c\u044b') <\/code><\/pre>\n","protected":false},"excerpt":{"rendered":"<p>\u041f\u0440\u0438 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438 \u0444\u043e\u0440\u043c \u043e\u0431\u0449\u0438\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u043e\u0441\u0442\u0430\u0451\u0442\u0441\u044f \u043f\u0440\u0435\u0436\u043d\u0438\u043c: \u043d\u0435 \u0441\u0442\u043e\u0438\u0442 \u0442\u0440\u0430\u0442\u0438\u0442\u044c \u0432\u0440\u0435\u043c\u044f \u043d\u0430 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0443 Python, Django, \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u043c\u044b\u0445 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a \u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439. \u041c\u043e\u0436\u043d\u043e \u043f\u0440\u0438\u043d\u044f\u0442\u044c \u0437\u0430 \u0430\u043a\u0441\u0438\u043e\u043c\u0443, \u0447\u0442\u043e \u043f\u043e\u043b\u0435 \u0434\u043b\u044f \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0438 \u043f\u0440\u0438\u043c\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0443, \u0430 \u043f\u043e\u043b\u0435 \u044d\u043b\u0435\u043a\u0442\u0440\u043e\u043d\u043d\u043e\u0439 \u043f\u043e\u0447\u0442\u044b \u2014 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0447\u0442\u043e\u0432\u044b\u0439 \u0430\u0434\u0440\u0435\u0441: \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0430 \u0443\u0436\u0435 \u043f\u0440\u043e\u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043b\u0438 \u044d\u0442\u043e. \u0422\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u043b\u0438\u0448\u044c \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0440\u0443\u0447\u043d\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0439 \u043a\u043e\u0434. \u0422\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0444\u043e\u0440\u043c \u0412\u0441\u0435 \u0442\u0435\u0441\u0442\u044b \u0434\u043b\u044f \u0444\u043e\u0440\u043c [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[187],"tags":[],"class_list":["post-18546","post","type-post","status-publish","format-standard","","category-uroki"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v26.6 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Unittest \u0432 Django: \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 Forms<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/mob25.com\/blog\/unittest-v-django-testirovanie-forms\/\" \/>\n<meta property=\"og:locale\" content=\"ru_RU\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Unittest \u0432 Django: \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 Forms\" \/>\n<meta property=\"og:description\" content=\"\u041f\u0440\u0438 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438 \u0444\u043e\u0440\u043c \u043e\u0431\u0449\u0438\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u043e\u0441\u0442\u0430\u0451\u0442\u0441\u044f \u043f\u0440\u0435\u0436\u043d\u0438\u043c: \u043d\u0435 \u0441\u0442\u043e\u0438\u0442 \u0442\u0440\u0430\u0442\u0438\u0442\u044c \u0432\u0440\u0435\u043c\u044f \u043d\u0430 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0443 Python, Django, \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u043c\u044b\u0445 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a \u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439. \u041c\u043e\u0436\u043d\u043e \u043f\u0440\u0438\u043d\u044f\u0442\u044c \u0437\u0430 \u0430\u043a\u0441\u0438\u043e\u043c\u0443, \u0447\u0442\u043e \u043f\u043e\u043b\u0435 \u0434\u043b\u044f \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0438 \u043f\u0440\u0438\u043c\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0443, \u0430 \u043f\u043e\u043b\u0435 \u044d\u043b\u0435\u043a\u0442\u0440\u043e\u043d\u043d\u043e\u0439 \u043f\u043e\u0447\u0442\u044b \u2014 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0447\u0442\u043e\u0432\u044b\u0439 \u0430\u0434\u0440\u0435\u0441: \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0430 \u0443\u0436\u0435 \u043f\u0440\u043e\u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043b\u0438 \u044d\u0442\u043e. \u0422\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u043b\u0438\u0448\u044c \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0440\u0443\u0447\u043d\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0439 \u043a\u043e\u0434. \u0422\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0444\u043e\u0440\u043c \u0412\u0441\u0435 \u0442\u0435\u0441\u0442\u044b \u0434\u043b\u044f \u0444\u043e\u0440\u043c [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/mob25.com\/blog\/unittest-v-django-testirovanie-forms\/\" \/>\n<meta property=\"og:site_name\" content=\"\u0418\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0435 \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0438\" \/>\n<meta property=\"article:published_time\" content=\"2022-03-27T15:17:13+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2023-05-09T18:48:00+00:00\" \/>\n<meta name=\"author\" content=\"violet\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/mob25.com\/blog\/unittest-v-django-testirovanie-forms\/\",\"url\":\"https:\/\/mob25.com\/blog\/unittest-v-django-testirovanie-forms\/\",\"name\":\"Unittest \u0432 Django: \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 Forms\",\"isPartOf\":{\"@id\":\"https:\/\/mob25.com\/blog\/#website\"},\"datePublished\":\"2022-03-27T15:17:13+00:00\",\"dateModified\":\"2023-05-09T18:48:00+00:00\",\"author\":{\"@id\":\"https:\/\/mob25.com\/blog\/#\/schema\/person\/493391ea0717532d228de3cda6d7cf45\"},\"breadcrumb\":{\"@id\":\"https:\/\/mob25.com\/blog\/unittest-v-django-testirovanie-forms\/#breadcrumb\"},\"inLanguage\":\"ru-RU\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/mob25.com\/blog\/unittest-v-django-testirovanie-forms\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/mob25.com\/blog\/unittest-v-django-testirovanie-forms\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"\u0413\u043b\u0430\u0432\u043d\u0430\u044f \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430\",\"item\":\"https:\/\/mob25.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Unittest \u0432 Django: \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 Forms\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/mob25.com\/blog\/#website\",\"url\":\"https:\/\/mob25.com\/blog\/\",\"name\":\"\u0418\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0435 \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0438\",\"description\":\"\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/mob25.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"ru-RU\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/mob25.com\/blog\/#\/schema\/person\/493391ea0717532d228de3cda6d7cf45\",\"name\":\"violet\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"ru-RU\",\"@id\":\"https:\/\/mob25.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/d4571412769d757e8ecacdf5967ea55865839b6d95042f5fc535566d9d3533d0?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/d4571412769d757e8ecacdf5967ea55865839b6d95042f5fc535566d9d3533d0?s=96&d=mm&r=g\",\"caption\":\"violet\"},\"url\":\"https:\/\/mob25.com\/blog\/author\/nkl\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Unittest \u0432 Django: \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 Forms","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/mob25.com\/blog\/unittest-v-django-testirovanie-forms\/","og_locale":"ru_RU","og_type":"article","og_title":"Unittest \u0432 Django: \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 Forms","og_description":"\u041f\u0440\u0438 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438 \u0444\u043e\u0440\u043c \u043e\u0431\u0449\u0438\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u043e\u0441\u0442\u0430\u0451\u0442\u0441\u044f \u043f\u0440\u0435\u0436\u043d\u0438\u043c: \u043d\u0435 \u0441\u0442\u043e\u0438\u0442 \u0442\u0440\u0430\u0442\u0438\u0442\u044c \u0432\u0440\u0435\u043c\u044f \u043d\u0430 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0443 Python, Django, \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u043c\u044b\u0445 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a \u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439. \u041c\u043e\u0436\u043d\u043e \u043f\u0440\u0438\u043d\u044f\u0442\u044c \u0437\u0430 \u0430\u043a\u0441\u0438\u043e\u043c\u0443, \u0447\u0442\u043e \u043f\u043e\u043b\u0435 \u0434\u043b\u044f \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0438 \u043f\u0440\u0438\u043c\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0443, \u0430 \u043f\u043e\u043b\u0435 \u044d\u043b\u0435\u043a\u0442\u0440\u043e\u043d\u043d\u043e\u0439 \u043f\u043e\u0447\u0442\u044b \u2014 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0447\u0442\u043e\u0432\u044b\u0439 \u0430\u0434\u0440\u0435\u0441: \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0430 \u0443\u0436\u0435 \u043f\u0440\u043e\u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043b\u0438 \u044d\u0442\u043e. \u0422\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u043b\u0438\u0448\u044c \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0440\u0443\u0447\u043d\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0439 \u043a\u043e\u0434. \u0422\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0444\u043e\u0440\u043c \u0412\u0441\u0435 \u0442\u0435\u0441\u0442\u044b \u0434\u043b\u044f \u0444\u043e\u0440\u043c [&hellip;]","og_url":"https:\/\/mob25.com\/blog\/unittest-v-django-testirovanie-forms\/","og_site_name":"\u0418\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0435 \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0438","article_published_time":"2022-03-27T15:17:13+00:00","article_modified_time":"2023-05-09T18:48:00+00:00","author":"violet","twitter_card":"summary_large_image","schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/mob25.com\/blog\/unittest-v-django-testirovanie-forms\/","url":"https:\/\/mob25.com\/blog\/unittest-v-django-testirovanie-forms\/","name":"Unittest \u0432 Django: \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 Forms","isPartOf":{"@id":"https:\/\/mob25.com\/blog\/#website"},"datePublished":"2022-03-27T15:17:13+00:00","dateModified":"2023-05-09T18:48:00+00:00","author":{"@id":"https:\/\/mob25.com\/blog\/#\/schema\/person\/493391ea0717532d228de3cda6d7cf45"},"breadcrumb":{"@id":"https:\/\/mob25.com\/blog\/unittest-v-django-testirovanie-forms\/#breadcrumb"},"inLanguage":"ru-RU","potentialAction":[{"@type":"ReadAction","target":["https:\/\/mob25.com\/blog\/unittest-v-django-testirovanie-forms\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/mob25.com\/blog\/unittest-v-django-testirovanie-forms\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"\u0413\u043b\u0430\u0432\u043d\u0430\u044f \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430","item":"https:\/\/mob25.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Unittest \u0432 Django: \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 Forms"}]},{"@type":"WebSite","@id":"https:\/\/mob25.com\/blog\/#website","url":"https:\/\/mob25.com\/blog\/","name":"\u0418\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0435 \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0438","description":"","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/mob25.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"ru-RU"},{"@type":"Person","@id":"https:\/\/mob25.com\/blog\/#\/schema\/person\/493391ea0717532d228de3cda6d7cf45","name":"violet","image":{"@type":"ImageObject","inLanguage":"ru-RU","@id":"https:\/\/mob25.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/d4571412769d757e8ecacdf5967ea55865839b6d95042f5fc535566d9d3533d0?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/d4571412769d757e8ecacdf5967ea55865839b6d95042f5fc535566d9d3533d0?s=96&d=mm&r=g","caption":"violet"},"url":"https:\/\/mob25.com\/blog\/author\/nkl\/"}]}},"_links":{"self":[{"href":"https:\/\/mob25.com\/blog\/wp-json\/wp\/v2\/posts\/18546","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/mob25.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/mob25.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/mob25.com\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/mob25.com\/blog\/wp-json\/wp\/v2\/comments?post=18546"}],"version-history":[{"count":0,"href":"https:\/\/mob25.com\/blog\/wp-json\/wp\/v2\/posts\/18546\/revisions"}],"wp:attachment":[{"href":"https:\/\/mob25.com\/blog\/wp-json\/wp\/v2\/media?parent=18546"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/mob25.com\/blog\/wp-json\/wp\/v2\/categories?post=18546"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/mob25.com\/blog\/wp-json\/wp\/v2\/tags?post=18546"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}