@sramis

Тесты в django. Не создается задача через форму, на локал хосте все работает как надо. Что исправить?

помогите, пожалуйста, разобраться с тестом. В test_post_task_create получаю код 200. И таска через форму не создается получается. Уже все испробовал, вроде все верно. Залогенный юзер автоматически становится автором таски при создании. На локале все работает как надо.

```
class Task_CRUD_test(TestCase):

def setUp(self):
self.user = User.objects.create(first_name='Al', last_name='Pacino', username='Scarface', password='123')
self.client.force_login(self.user)
self.status1 = Status.objects.create(name='готово')
self.status2 = Status.objects.create(name='в процессе')
self.task = Task.objects.create(name='The matrix', status=self.status1, author=self.user)

def test_get_task_create(self):
response = self.client.get(reverse('task:task_create'))
self.assertEqual(response.status_code, 200)
self.assertTemplateUsed(response, 'task/task_create.html')

def test_post_task_create(self):
form_data = TaskCreateForm(data={
'name': 'Totoro',
'description': 'must watch it!',
'status': self.status2,
}).data
response = self.client.post(reverse('task_create'), form_data, follow=True)
self.assertEqual(response.status_code, 302)
self.assertTrue(Task.objects.filter(name='Totoro').exists())
task = Task.objects.get(name='Totoro')
self.assertEqual(task.author_id, self.user.id)
self.assertEqual(task.author.first_name, 'Al')
self.assertRedirects(response, '/tasks/')
self.assertEqual(task.status, 'в процессе')

**А это сам вью.**

class TaskCreateView(LoginRequiredMixin, SuccessMessageMixin, CreateView):
model = Task
form_class = TaskCreateForm
template_name = 'task/task_create.html'
success_url = reverse_lazy('tasks')
success_message = 'Задача успешно создана'

def form_valid(self, form):
form.instance.author = self.request.user
return super(TaskCreateView, self).form_valid(form)

**модель**
class Task(models.Model):
name = models.CharField(max_length=200, unique=True, verbose_name='Имя')
description = models.TextField(blank=True, verbose_name= 'Описание')
status = models.ForeignKey(Status, related_name='status', on_delete=models.PROTECT, verbose_name='Статус')
executor = models.ForeignKey(User, related_name='executor', null=True, blank=True, on_delete=models.PROTECT, verbose_name='Исполнитель')
labels = models.CharField(max_length=200, null=True, blank=True, verbose_name='Метки')
created_at = models.DateTimeField(auto_now_add=True)
author = models.ForeignKey(User, related_name='author', on_delete=models.PROTECT, verbose_name='Автор')

class Meta:
db_table = 'Task'

def __str__(self):
return f"Задача {self.name} от {self.author}. Cтатус {self.status}. Исполняет {self.executor}"
```
  • Вопрос задан
  • 61 просмотр
Решения вопроса 1
grantur5707
@grantur5707
Full Stack Web Developer
Проверьте, как вы передаёте данные формы при отправке POST-запроса. В test_post_task_create, вы используете form_data = TaskCreateForm(data={...}).data, что может некорректно собирать данные для отправки в запросе.

ef test_post_task_create(self):
    form_data = {
        'name': 'Totoro',
        'description': 'must watch it!',
        'status': self.status2.id, 
    }
    response = self.client.post(reverse('task_create'), form_data, follow=True)
    
    self.assertEqual(response.status_code, 302)
    self.assertTrue(Task.objects.filter(name='Totoro').exists())
    task = Task.objects.get(name='Totoro')
    self.assertEqual(task.author_id, self.user.id)
    self.assertEqual(task.author.first_name, 'Al')
    self.assertRedirects(response, '/tasks/')
    self.assertEqual(task.status.id, self.status2.id)
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
06 окт. 2024, в 08:42
20000 руб./за проект
06 окт. 2024, в 08:24
2500000 руб./за проект
06 окт. 2024, в 07:28
1111 руб./за проект